关于Effective Objective-C 这本书一些有趣的
前言
前段时间把Effective Objective-C 这本书慢慢的看了下,记录每章一些需要注意的知识点。说实话,这本书籍写的真的是经典,我感觉过段时间还得细读一遍。
目前对于每章的记录,有点类似流水账,就是粗略的记录知识点,方便快速浏览,希望过段时间可以慢慢思考每章每个知识点。
Effective Objective-C 2.0 总结(一)
Effective Objective-C 2.0 总结(二)
Effective Objective-C 2.0 总结(三)
Effective Objective-C 2.0 总结(四)
Effective Objective-C 2.0 总结(五)
Effective Objective-C 2.0 总结(六)
Effective Objective-C 2.0 总结(七)
正文
这里记录下在读这本书一些有趣的东西,可以在平时编码的时候注意
利用@class 向前声明 来解决两个类相互引用的问题
A 类中有B 类的属性,B 类中也有A 类的属性;在这种情况下,我们用import、include 都是不能解决的,用@class 就可以完美解决这个问题,而且用@class 还可以减少对其他类的依赖,减少链接其他类所需要的时间,从而降低编译时间
读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做
通过属性来访问其实就调用set/get 方法,用实例变量来访问其实就是利用指针直接操作,这样子不用经过Objective-C 的 “方法派发” 步骤,这样子速度会比较快= =
Cocoa 中大部分collection 类都是类族
类族使用 “工厂模式”,调用抽象基类方法返回子类实例,这样子可以隐藏子类实现的细节,但是要注意,我们这样子用基类生成的实例,很有可能并不是基类的实例而是子类的实例,这个时候我们要弄清楚这两个方法的区别
-(BOOL) isKindOfClass: classObj; 判断是否是这个类或者这个类的子类的实例
-(BOOL) isMemberOfClass: classObj; 判断是否是这个类的实例
关于 “协议” 可选方法的判断
在实现委托模式和数据源模式的时,协议中的方法是可选的,我们就会写出大量这种判断代码:
if([_delegate respondsToSelector:@selector(networkFetcher:didRecevieData:)]){
[_delegate networkFetcher:self didRecevieData:data];
}
- 每次调用方法都会判断一次,其实除了第一次检测的结构有用,后续的检测很有可能都是多余的,因为委托对象本身没变,不太可能会一下子不响应,一下子响应的,所以我们这里可以把这个委托对象能否响应某个协议方法记录下来,以优化程序效率。
- 将方法响应能力缓存起来的最佳途径是使用 “位段”(bitfield)数据类型。我们可以把结构体中某个字段所占用的二进制位个数设为特定的值。
位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。
struct data {
unsigned int filedA : 8;
unsigned int filedB : 4;
unsigned int filedC : 2;
unsigned int filedD : 1;
}
filedA 位段占用8个二进制位,filedB 位段占用4个二进制位,filedC 位段占用2个二进制位,filedD位段占用1个二进制位。filedA 就可以表示0至255之间的值,而filedD 则可以表示0或1这两个值。
我们可以像filedD 这样子,创建大小只有1的位段,这样子就可以把Boolean 值塞入这一小块数据里面,这里很适合这样子做。
-
利用位段就可以清楚的表示delegate 对象是否能响应协议中的方法。
@interface EOCNetworkingFetcher () struct { unsigned int didReceiveData : 1; unsigned int didFailWithError : 1; unsigned int didUpdateProgressTo : 1; } _delegateFlags @end //使用 //set flag _delageteFlags.didReceiveData = 1; //check flag if(_delageteFlags.didReceiveData){ //YES }
-
可以在delegate 属性的设置方法里面写实现缓存功能所用的代码。
-
这样子,每次调用delegate 的相关方法之前,就不用检测委托对象是否能响应给定的选择子了,而是直接查询结构体里面的标志。
-
在相关方法需要调用很多次时,就要思考是否有必要进行优化,分析代码性能,找出瓶颈,使用这个位段这个技术可以提供执行速度。
使用atomic 特质来修饰属性,来保证其原子性 但是不代表是线程安全的
属性是开发者经常需要同步的地方,可以使用atomic 特质来修饰属性,来保证其原子性,每次肯定可以从中获取到有效值,然而在同一个线程上多次调用获取方法(getter),每次获取到结果未必相同,在两次访问操作之间,其他线程可能会写入新的属性值。
使用 “串行同步队列”,将读取操作及写入操作都安排在同一个队列里,即可保证数据同步。
对于NSTimer 设置tolerance 这个偏差时间 可以提高性能
最后
这次看完,感觉对很多知识点都了解的不深,很多原理性的东西完全不懂,还是得多加把劲呀。
最后,还是推荐大家去看原著 少数优秀的Objective-C 书籍之一 = =
努力,奋斗!