《Effective Objective-C 2.0----编写
2017-04-05 本文已影响19人
f432508bcae0
- OC起源
非OC对象存在栈上,OC对象在堆上。 - 在类的头文件中尽量少引入其他头文件
会增加编译时间,会增加类之间的耦合性 - 多用字面量语法,少用与之等价的方法
更简洁,如果值中有nil会抛出异常(等价方法不会,会在碰到nil时结束,导致存储的值不完整,不易于调试)。 - 多用类型常量,少用#define预处理指令
预处理的过程中会把所有的名称都做转换
用static const代替#define会更好
常用的命名法是:若常量局限于某实现文件之内,则在前面加字母"k";若常量在类之外可见,则通常以类名为前缀。
extend 声明外部引用(命名方式:类名前缀。在.h文件中用extentd,在.m文件中用const复制值) - 用枚举表示状态、选项、状态码
typedef自定义类型,方便、清晰易懂
多个选项同时使用时,按位或操作将其组合起来 - 理解属性
1.[原子性]:在并发编程中,如果某操作具备整体性(即,系统无法观察到其中间步骤的临时结果,只能看到操作前与操作后的结果),那么该操作就是原子性的。atomic与nonatomic的区别是,具备atomic特质的获取方法会通过锁定机制来确保其操作的原子性。但由于iOS中使用同步锁的开销较大,会带来性能问题。一般情况下并不要求属性必须是原子性的,因为这个机制并不一定能保证线程安全。例如,一个线程在连续多次读取某个属性时,另一线程同时在改写该属性,那么即便是atomic也会读到不同的属性值。
2.[readwrite]:读写特质,拥有getter与setter方法。若由@synthesize实现,会自动生成这两个方法
3.[readonly]:只读特性。仅拥有getter方法
4.[assign]:设置方法只会执行针对纯良类型(CGFloat、NSInteger等)的简单复制操作
5.[strong]:为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。
6.[weak]:为这种属性设置新值时,设置方法即不保留新值,也不释放旧值,然而在属性所指的对象遭到摧毁时,属性值也会清空。
7.[copy]:与strong类似。然而设置方法并不保留新值,而是将其拷贝。 - 在对象内部尽量直接访问实例变量
在对象内部读取数据直接用,写入数据通过属性。
dealloc中直接通过来读写数据 - 对象同等性
1.应比较两个对象的指针
2.哈希码有可能相同,对象却不同
3.编写hash时,尽量使用速度快而且hash碰撞几率低的算法 - 以“类族模式”隐藏实现细节
类族模式可以把实现细节隐藏在一套简单的公共接口后面
cocoa中的集合类型大多使用类族 - 在既有类中使用关联对象存放自定义数据
可以通过“关联对象”机制来把两个对象连起来
定义关联对象时可指定内存管理语义
尽量少用,只有在其他做法不可行时才应选用关联对象。因为这种做法通常会引入难以查找的bug - 理解objc_msgSend
- 理解消息转发机制
- 用“方法调配技术”调试“黑盒方法”
- 理解“类对象”的用意
- 用前缀避免命名空间冲突
选择与你的公司、应用程序或二者皆有关联之名称作为类名的前缀,并在所有代码中均使用这一前缀。
若自己所开发的程序库中用到了第三方库,则应为其中的名称加上前缀。 - 提供“全能初始化方法”
在类中提供一个全能初始化方法,并于文档里指明。其他初始化方法均应调用此方法。
若全能初始化方法与超类不同,则需覆写超类中的对应方法。
如果超类的初始化方法不适用于子类,那么应该覆写这个超类方法,并在其中抛出异常。 - 实现description方法
方便调试bug - 尽量使用不可变对象
尽量使用不可变对象
若某属性仅可于对象内部修改,则在.m中将其由readonly拓展为readwrite属性
不要把可变的collection作为属性公开,而应该提供相关方法,以此修改对象中的可变collection - 使用清晰而协调的命名方式
驼峰命名 - 为私有方法名加前缀
给私有方法名加前缀,可以很容易地将其同公共方法区分开
不要单用一个_做私有方法的前缀,这是预留给官方用的 - 理解Objective-C错误模型
<p>Error domain:错误范围,其类型为字符串。通常用一个特有的全局常量来定义。
Error code:错误码,其类型为整数。通常定义为枚举类型。
User info:用户信息,其类型为字典</p>
只有发生了可使整个应用崩溃的严重错误时,才应使用异常。
在错误不那么严重的情况下,可以指派“委托方法”(delegate method)来处理错误,也可以把错误信息放在NSError对象里,经由“输出参数”返回给调用者。 - 理解NSCopying协议
若想令自己所写的对象具有拷贝功能,则需实现NSCopying协议
如果自定义的对象分为可变版本与不可变版本,那么就要同时实现NSCopying与NSMutableCopying协议
复制对象时需要决定采用浅拷贝还是深拷贝,一般情况下应尽量执行浅拷贝
如果你写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法 - 通过委托与数据源协议进行对象间通信
用@optional标注可选方法 - 将类的实现代码分散到便于管理的数个分类之中
使用分类机制把类的实现代码划分成易于管理的小块
将应该视为私有的方法归入名叫Private的分类中,以隐藏实现细节 - 总是为第三方类的分类名称加前缀
向第三方类中添加分类时,总应给其名称以及其中的方法加上你专用的前缀 - 勿在分类中声明属性
把封装数据所用的全部属性都定义在主接口里
在.m之外的其他分类中,可以定义存取方法,但尽量不要定义属性
后续更新