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