第6条:理解“属性”这一概念
需要理解的概念:对象、消息传递、Object-C运行期环境
属性的相关概念:存取方法/获取方法/设置方法/点语法/自动合成/应用程序二进制接口(Application Binary Interface,ABI)
ABI定义了许多内容,其中一项就是生成代码时所应遵循的规范。
属性的特质:
- 原子性(atomicity/nonatomic)
- 读/写权限(readonly/readwrite)
- 内存管理语义(assign/strong/weak/unsafe_unretained/copy)
- 方法名(getter/setter)
要点:
- 可以用@property语法来定义对象中所封装的数据。
- 通过“特质”来指定存储数据所需的正确定义
- 在设置属性所对应的实例变量时,一定要遵从该属性所声明的语义。
- 开发iOS程序时应该使用nonatomic属性,因为atomic属性会严重影响性能。
第7条:在对象内部尽量直接访问实例变量
直接访问实例变量存在的现象:
- 不经过OC的“方法派发”步骤,访问速度比较快;
- 不会调用设置方法,绕过了为相关属性所定义的“内存管理语义”;
- 不会触发KVO;
- 不方便打断点
要点:
- 在对象内部读取数据时,应该直接通过实例变量来读,而写入数据时,则应通过属性来写。
- 在初始化方法及dealloc方法中,总是应该通过实例变量来读写数据,因为担心子类会重写存取方法。
- 有时会使用惰性初始化技术配置某份数据,这种情况下,需要通过属性来读取数据。
- 开发iOS程序时应该使用nonatomic属性,因为atomic属性会严重影响性能。
第8条:理解”对象等同性“这一概念
这一点完全没看太懂,要多看几遍
参考文章:iOS开发 之 不要告诉我你真的懂isEqual与hash!
isEqual的原理就是先判断A/B两个对象的指针是否一致,再判断A、B是否为同一类,最后判断A、B的属性值是否一致,如果是NSSet和NSDictionary类则应该判断hash值,如果hash值一致再判断对象。 不知道是不是这么理解的。
要点:
- 若想检测对象的等同性,请提供"isEqual:"与hash方法。
- 相同的对象必须具有相同的hash码,但是两个哈希码相同的对象却未必相同。
- 不要盲目的逐个检测每条属性,而是应该依照具体需求来制定检测方案。
- 编写hash方法时,应该使用计算速度快而且哈希码碰撞几率低的算法。
第9条:以“类簇模式”隐藏实现细节
类簇 是一群隐藏在通用接口下的与实现相关的类,使得我们编写的代码可以独立于底层实现(因为接口是稳定的)。
如创建NSString对象时,你得到的可能是NSLiteralString,NSCFString,NSSimpleCString等。即不同的NSString对象调用同一个接口A,接口A的实现可能是不同的。
在Foundation框架中,常见的类簇有NSString,NSArray,NSDictionary,NSSet等collection类。 想要在类簇中创建子类会困难一些,必须是抽象超类的子类,必须重载超类的原始方法,必须声明自己的数据存储。最方便的是使用组合或者类别来代替子类化。
要点:
- 类蔟模式可以把实现细节隐藏在一套简单的公共接口后面。
- 系统框架中经常使用类蔟。
- 从类蔟的公共抽象基类中继承子类时要当心,若有开发文档,则应首先阅读。
网友评论