美文网首页
Effective Objective-C 2.0编写高质量iO

Effective Objective-C 2.0编写高质量iO

作者: 夜之海澜 | 来源:发表于2018-08-26 21:12 被阅读4次

1.OC为C语言的超集,为C语言添加了面向对象特性.OC使用动态绑定的消息结构,也就是说在运行时才检查对象类型,接收一条消息之后,究竟应执行何种代码,有运行期环境而非编译器来决定.

2.@class 向前声明
首先,将引入头文件的时机尽量延后,只有确有需要时才引入,这样就可以减少类的使用者所需引入的头文件数量,可以减少编译时间.
其次,也解决了两个类互相引用的问题.

3.多用字面量语法
数组需要注意问题: 用字面量创建数组时需注意,若数组元素对象中有nil,则会抛出异常,因为字面量语法实际上只是一种'语法糖',其效果等于是先创建了一个数组,然后把方括号内的所有对象加到这个数组中.以下对比两种创建数组的方式:
id object1 = /.../;
id object2 = /.../;
id object3 = /.../;
NSArray *arrayA = [NSArray arrayWithObjects: object1, object2, object3,nil];
NSArray *arrayB = @[object1, object2, object3];
如果object1和object3都指向了有效的对象, object2是nil,则按字面量方式创建的B数组会抛出异常,二A数组虽然能创建出来,但是其中却只含有object1一个对象.原因在于arrayWithObjects方法会依次处理各个参数,直到发现nil为止,由于object2是nil,所以该方法会提前结束.所以相比较而言字面量更为安全,抛出异常,终止应用程序.
字典需要注意问题: 同上数组问题一样
使用字面量语法创建出来的字符串,数组,字典对象都是不可变的,若想要可变版本的对象,则需要复制一份

4.多用类型常量,少用#define预处理指令

5.用枚举表示状态选项状态码

6.属性
atomic和nonatomic的区别是什么呢?atomic特质的获取方法会通过锁定机制来确保其操作的原子性.也就是说,如果两个线程读写同一个属性,那么不论何时总能看到有效的属性值.若是不加锁的话,那么当其中一个线程正在改写某属性值时,另外一个线程也许会突然闯入,把尚未修改好的属性值读取出来.这种情况线程读取的属性值可能不对.

7.在对象内部尽量直接访问实例变量

8.理解'对象等同性'这一概念

9.以'类族模式'隐藏实现细节

10.在既有类中使用关联对象存放自定义数据

11.理解objc_msgSend的作用
传递消息 消息由接收者,选择子及参数构成,给某对象发送消息也就相当于在该对象上调用方法.

12.理解消息转发机制
前言:
如果在编译期向类发送了其无法解读的消息并不会报错,因为在运行期可以继续向类中添加方法,所以编译器在编译时还无法确知类中到底会不会有某个方法实现.当对象接收到无法解读的消息后,就会启动消息转发机制,程序员可经由此过程告诉对象应该如何处理未知消息.
过程:
消息转发分为两大阶段.
第一阶段,先征询接收者所属的类,看其是否能动态添加方法,以处理当前这个未知的选择子,这叫做'动态方法解析';
对象在收到无法解读的消息后,首先将调用其所属类的下列类方法:

  • (BOOL)resolveInstanceMethod:(SEL)sel
    该方法参数就是那个未知的选择子,返回值布尔类型,表示这个类是否能新增一个实例方法用以处理此选择子.
    如果无法解读的是类方法,则调用
  • (BOOL)resolveClassMethod:(SEL)sel

第二阶段,完整的消息转发机制,如果运行期系统已经把第一阶段执行完了,那么接收者自己就无法再以动态新增方法的手段来响应包含该选择子的消息了.此时,运行期系统会请求接收者以其他手段来处理与消息相关的方法调用.这里,又细分为两小步.第一步,请接收者看看有没有其他对象能处理这条消息.若有,则运行期系统会把消息转给那个对象,于是消息转发过程结束,一切如常.若没有'备援的接收者',则启动完整的消息转发机制,运行期系统会把与消息有关的全部细节都封装到NSInvocation对象中,再给接收者最后一次机会,令其设法解决当前还未处理的这条消息.

备援接收者:当前接收者还有第二次机会能处理未知的选择子,在这一步中,运行期系统会问它:能不能把这条消息转给其他接收者来处理.与该步骤对应的处理方法如下:

  • (id)forwardingTargetForSelector:(SEL)aSelector
    参数代表未知的选择子,若当前接收者能找到备援对象,则将其返回,若找不到,就返回nil

完整的消息转发:如果已经来到这一步的话,就得要启动完整的消息转发机制了.首先创建NSInvocation对象,把尚未处理的那条消息有关的全部细节都封于其中.此对象包含选择子,目标(target)及参数.在触发NSInvocation对象时,消息派发系统将亲自出马,把消息指派给目标对象.此步骤会调用下列方法来转发消息:

  • (void)forwardInvocation:(NSInvocation *)anInvocation
    这个方法可以实现得很简单:只需改变调用目标,使消息在新目标上得以调用即可.然而这样实现出来的方法与备援接收者方法所实现的方案等效.所以很少有人采用这么简单的实现方式.比较有用的实现方式为:在触发消息前,先以某种方式改变消息内容,比如追加另外一个参数,或者改变选择子等等.

相关文章

网友评论

      本文标题:Effective Objective-C 2.0编写高质量iO

      本文链接:https://www.haomeiwen.com/subject/jlioiftx.html