一句话笔记,某段时间内遇到或看到的某个可记录的点。 2016-8-14
- CFAbsoluteTimeGetCurrent()
- 判断浮点数相等
- init & initWithFrame
- iOS 中常用的数学函数
1、CFAbsoluteTimeGetCurrent()
CFAbsoluteTimeGetCurrent() 函数可以打印出当前的时间戳,精度还是很高的,它作为我们测试应用启动时间还是相当方便的
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
// do something
CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();
言简意赅,它就是调试函数耗时的利器,在我们测测我们项目的启动时间啊,或者某次加载数据的时间的都是比较精确的。
2、判断浮点数相等
通常我们判断相等的时候,直接 a == b
就OK啦,但是浮点数中有问题哦,需要特殊处理一下。
if( fabs(a-b) <= 1e-6 ){
NSLog(@"equal");
}else{
NSLog(@"not equal");
}
原因是浮点数的表示都是是不精确的,float
和double
都不能保证可以把所有实数都准确的保存在计算机中,所以一般都是在允许的某个范围内就认为某两个浮点数相等,如有两个浮点数a
、b
,允许的误差范围为 1e-6
,则 abs(a-b) <= 1e-6
,即可认为 a
和b
相等。
3、init & initWithFrame
比较缘于:我在自定义 UIView 的时候,发现现在一般都是直接写 - (instancetype)initWithFrame:(CGRect)frame
, 但是现在我们基本都用的是自动布局,一般都不写 frame ,然后就在想是否可以直接写 init
,发现是可以的,但是不一定有保证。于是测试一番得知:
- (instancetype)init {
if (self = [super init]) {
NSLog(@"init");
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
NSLog(@"initWithFrame");
}
return self;
}
- 外部调用
init
的方法的时候,其内部也会默默地调用initWithFrame:
方法 - 外部调用
initWithFrame:
, 内部就是仅仅调用它啦。
同时也查看了一番相关的资料,参考使用代码自定义UIView注意一二三,顺便发现了自己平常容易忽略的两个点:
- 在构造方法里面,直接获取self 本身的高或宽
- 布局控件,还是在
layoutSubViews
方法里面布局好,让各个方法做好自己的事,但是不能忘记重写父类的方法。
结论:对于上述的比较,还是一般的自定义直接重写 initWithFrame:
方法就好啦,毕竟我们不能不保证团队中的其他同事直接写 init
进行初始化。 当然一般来说,完整的一点的自定义 View 都会一起重写啦。
4、iOS 中常用的数学函数
在记录上篇笔记iOS 动画 —— transform 中发现自己的数学知识好差啊,一不用都不记的啦,就临时记住了几个,在此特意查找了下iOS 常用数学函数, 并在此选取了一些可能用到的重写一遍,加深印象。
- 三角函数
double sin (double); //正弦
double cos (double); // 余弦
double tan (double); // 正切
- 反三角函数
double asin (double); //结果介于[-PI/2, PI/2]
double acos (double); // 结果介于[0, PI]
double atan (double); //反正切(主值), 结果介于[-PI/2, PI/2]
double atan2 (double, double); //反正切(整圆值), 结果介于[-PI, PI]
- 指数与对数
double exp (double); //求取自然数e的幂
double sqrt (double); // 开平方
double log (double); // 以e为底的对数
double log10 (double); //以10为底的对数
double pow(double x, double y); //计算以x为底数的y次幂
float powf(float x, float y); //功能与pow一致,只是输入与输出皆为浮点数
- 取整
double ceil (double); //取上整
double rint (double); // 四舍五入取整
double floor (double); //取下整
- 绝对值
double fabs (double); //求绝对值
double cabs(struct complex znum) ; //求复数的绝对值
- 标准化浮点数
double frexp (double f, int *p); //标准化浮点数, f = x * 2^p, 已知f求x, p ( x介于[0.5, 1] )
double ldexp (double x, int p); //与frexp相反, 已知x, p求f
- 取整与取余
double modf (double, double*); // 将参数的整数部分通过指针回传, 返回小数部分
double fmod (double, double); // 返回两参数相除的余数
- 其他
double hypot(double x, double y); // 已知直角三角形两个直角边长度,求斜边长度
double ldexp(double x, int exponent); //计算x*(2的exponent次幂)
仔细看,里面还是有一些可能常用到的,有时可以为我们省好多事的, 例如 判断浮点数相等 就涉及到它啦!