目录
- KVO的细节,context、观察数组
- KVO的原理
- 自定义KVO
KVO细节
- context -> NULL,代表传入了一个空对象
- contenx如果是id类型,则可以传入nil,是void *类型,则传NULL
- context传入值,使整体性能更加安全、获取更直接
- 设置static void *PersonNameContext = &PersonNameContext
- (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary
- (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary
- 移除观察者,iOS9 之后不需要做移除操作
- 未移除观察者,还会继续向ViewController发送通知,当设置object为单例时,向被释放的内存发送消息会崩溃
- 手动、自动
- 下载进度 = 已下载 / 总数
- 对可变数组的观察
底层原理
- isa -> Person -> NSKVONotifying_Person(动态子类) -> 移除观察后这个类是否销毁
- 底层动态生成,runtime register类簇
- NSKVONotifying_Person与Person是父子关系,Student -> NSKVONotifying_Person -> Person
- NSKVONotifying_Person包含了哪些东西 - 方法
- 重写方法——-
- setNickName
- class
- dealloc
- _isKVOA
- isa回来
- NSKVONotifying_Person 销毁
- setter 方法 属于新建的动态子类
- setter方法可以区分属性和成员
- 明面 Person - setter 谁的?—-> NSKVONotifying_Person
- Person 与 xxx 关系
- 主类销毁时,NSKVONotifying_Person还存在
自定义KVO
- 观察的是属性,不能让成员变量进来
- 动态生成子类
- isa的指向 : KVONotifying_Person
- 保存观察者 -> 关联对象 保存数组
- 优化,自动释放,直接添加方法,em_dealloc -> setClass -> 父类
- 底层runtime方法一般以objc、object、class开头
FBKVOController
- FBKVOController不是单例,内部有单例进行保存
- 关联对象,保存了一个NSMutablSet集合
- 传入的是vc的属性,不是vc
- self释放 -> FBKVOTrl -> FB单例 -> self.person