分类

- 运行时
- 包含类方法、对象方法、协议、属性列表
- 会在程序启动Runtime环境初始化的时候,扫描分类并将分类方法(协议/属性)数组 倒序 排列,然后拼接到类对象数据结构的方法(协议/属性)中。所以分类方法可以“覆盖”原类方法(实际上是因为分类方法在前直接调用分类方法而不是真正的覆盖,原类方法还存在)。
关联对象

类扩展
- 编译时
- 一般用来声明私有成员变量、属性、方法(不常见)
- 一般寄宿在类的.m文件中
代理
- 代理模式的应用
- 委托方-协议-代理方
- weak避免循环引用
- 通常委托方和代理方是一对一的(多播代理可以一对多)
通知

- 观察者模式的应用
- 通知可以跨层传递,通常为一对多
KVO
- 动态生成被观察者的子类并重写相应setter方法,isa指向动态生成的子类
- 直接给成员变量赋值是不能触发KVO的,需要手动调用系统提供的willSetValueForKey与didSetValueForKey来触发
KVC
通过查找类属性对应的getter/setter方法(找不到->成员变量)来实现,同时NSObject有一个accessInstanceVariablesDirectly的属性控制在没有找到对应方法时是否继续查找成员变量。如果没有找到则抛出错误。
属性关键字
- 原子性:atomic、nonatomic
- 读写权限:readonly、readwrite
- 引用计数:assign(unsafe_unretained)、strong(retain)、weak、copy
- 类属性:class
- 要注意copy关键字对于对象的拷贝问题,要注意引用计数相关的属性关键字对应的setter的写法不同