Effective Objective-C 2.0 - 笔记

在 Swift 大行其道,Objective-C 渐行渐远的今天,这本书看起来还是获益匪浅。按照52条方法目录摘录一些笔记。

1. 了解 Objective-C 语言的起源

Objective-C 为 C 语言添加了面向对象的特性,是其超集。Objective-C 使用动态绑定的消息结构,运行时才会检查对象的类型。接受一条消息后,究竟执行何种代码,由运行期环境而非编译器决定。

5. 用枚举表示状态、选项、状态吗

6. 理解 “属性”可以概念

自动合成属性:@property,指定实例变量名称:@synthesize,属性特质:原子性/读写权限/读写方法名/内存管理,都做有详细的解释,就不在此赘述了。

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

直接访问实例变量:

  • 不经过方法派发(method dispatch)
  • 不调用设置方法(access methods)
  • 不触发键值观测(KVO)
  • 惰性初始化(lazy initialization)无法完成

11. 理解 objc_msgSend 的作用

例如:

1
id returnValue = [someObject messageName: parameter];

someObject 叫做接受者(receiver),messageName 叫做选择子(selector),选择子和参数合起来称为消息(message)。编译器看到消息后将其转换为一条标准的 C 语言函数调用,所调用函数 objc_msgSend,原型如下:

1
void objc_msgSend(id self, SEL cmd, ...)

编译器会把消息转换为如下函数:

1
2
3
id returnValue = objc_msgSend(someObject, 
@selector(messageName:),
parameter);

objc_msgSend 函数会依据接受者与选择子的类型,来搜寻接受者所属的类中方法列表(list of methods ),找到就跳至实现代码。若找不到就沿着继承体系向上查找。最终找不到就执行消息转发(message forwarding)。

未完