IOS-KVO

KVO(键值观察)机制实现技术,通过修改object对象的ISA指针指向中间代理类NSKVONotifying_xxx,NSKVONotifying_xxx的super_class指针指向原有的观察类对象object class

NSKVONotifying_xx生成的中间类重写被观察的对象的四个方法 class ,setter,dealloc,_isKVOA

001 重写class方法 是为了让观察对象调用[object class]返回的原有的类实例

002 重写setter方法 是为了能够监听到被观察者调用属性方法,如setXxxx(Xxxx为属性名称)或者调用setValude:forKey:时,能添加通知消息方法:

- (void)willChangeValueForKey:(NSString *)key

-   (void) didChangeValueForKey:(NSString *)key

在didChangeValueForKey:中调用观察者必须重写的方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

  • 自动通知,NSObject实现了自动通知的方法;

    • 存在setter访问器方法,并且通过setter方法或者self.xxx间接调用setter方法,则中间类会添加will/didChangeValueForKey:触发事件通知;
    • 不存在setter访问器方法,需要通过setValude:forKey:方法来修改属性,中间类会添加will/didChangeValueForKey:触发事件通知;
    • 对于集合类,如NSMutalArray,需要通过mutableArrayValueForKey来获取中间代理类,触发通知,否则直接通过addObject:无法收到通知;
    • 对于存在依赖关系的属性,具体可查看官方文档;
  • 手动通知:手动通知提供了更自由的方式去决定什么时间,什么方式去通知观察者。这可以帮助你最少限度触发不必要的通知,或者一组改变值发出一个通知,想要使用手动通知必须实现automaticallyNotifies-ObserversForKey: 方法;并且手动调用will/didChangeValueForKey:来触发通知;

  • 重写dealloc

    用来销毁新生成的NSKVONotifying_类;

    重写_isKVOA方法

    这个私有方法估计可能是用来标示该类是一个 KVO 机制声称的类。

  • 参考文献

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值