effective2.0阅读笔记
一.在类的头文件中尽量少引入其他头文件
1.除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量减少类之间的耦合。
2.有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,尽量吧“该类遵循某协议”的这条声明移至“class-continuation分类中”。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。
二.多用字面量语法,少用与之等价的方法
三.多用类型常量,少用#define预处理指令
1.不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译前据此进行查找与替换工作。即使有人重新定义了常量值,编译器也不会发出警告信息,这将导致应用程序内的常量值不一致。
2.在实现文件中使用static const 来定义“只在编译单元内可见的常量”。由于此类常量不在全局符号表中,所以无需为其名称加前缀。
3.在头文件使用extern来声明全局变量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称要加以区分,通常用与之相关的类名做前缀。
四.用枚举表示状态,选项,状态码
五.理解属性这一概念
六.在对象内部尽量直接访问实例变量
1.在对象内部读取数据时,应该直接通过实例变量来读,而写入数据时,则应通过属性来写。
2.在初始化方法及dealloc方法中。总是应该直接通过实例变量来读写数据。
3.有时会通过惰性初始化技术来配置某份数据,这种情况下,需要通过属性来读取数据。
七.以”类族模式“隐藏实现细节
1.类族模式可以把实现细节隐藏在一套简单地公共接口后面。
2.系统框架中经常使用类族。
3.从类族的公共抽象基类中继承子类时要当心,若有开发文档,则应首先阅读。
八.在既有类中使用关联对象存放自定义数据
1.可以使用关联对象机制把两个对象关联起来。
2.定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”和“非拥有关系”。
3.只有在其他做法不可行时才应使用关联对象,因为这种做法通常会引入难以查找的bug。
九.理解objc_msgSend的作用
1.消息有接受者,选择子和参数构成。给某对象发送消息也就相当于在该对象上调用方法。
2.发送某对象的所有消息都要由动态消息派发系统来处理,该系统会查出对象的方法,并执行其代码。
十.理解消息转发机制
1.若对象无法响应某个选择子,则进入消息转发流程。
2.通过运行期的动态方法解析功能,我们可以在需要用到某个方法时再将其加入类中。
3.对象可以把其无法解读的某些选择子转交给其他对象来处理。
4.经过上述两步之后,如果还是没办法处理选择子,就会启动完整的消息转发机制。
十一.用”方法调配技术(method swizzling)“调试”黑盒方法“
1.在运行期,可以在类中新增或替换选择子所对应的方法实现。
2.使用另一个方法来替换原有的方法实现,这道工序叫做“方法调配”,开发者常用此技术向原有实现中增加新功能。
3.一般来说,只有在调试程序的时候才需要在运行期修改方法实现,这种做法不宜滥用。
十二.理解“类对象“的用意
1.每个实例都有一个指向class对象的指针,用意表明其类型,而这些class则指定了类的继承体系。
2.如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知。
3.尽量使用类型信息查询方法来确定对象类型,而不要直接比较类对象,因为某些对象可能实现了消息转发功能。
十三.用前缀避免命名空间冲突
浙公网安备 33010602011771号