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.尽量使用类型信息查询方法来确定对象类型,而不要直接比较类对象,因为某些对象可能实现了消息转发功能。

十三.用前缀避免命名空间冲突

posted @ 2016-12-16 14:51  凌风4819  阅读(55)  评论(0)    收藏  举报