KVO

假设我们要监听的是Person的name属性

原理:

1.动态创建NSKVONotifying_Person,此类是Person的子类.

2.修改当前对象的isa指针->NSKVONotifying_Person.

3.只要调用对象的setName:,就会调用NSKVONotifying_Person的setName:方法.

4.重写NSKVONotifying_Person的set方法,[super setName:]通知观察者 属性改变了.

关键代码

新类被创建并继承自父类:

objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes)

在新类上重写setXXX方法:

BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

Person的isa指向新类:

Class object_setClass(id object, Class cls)

缺点:
  • 所有的observe处理都放在一个方法里
  • 严重依赖于string
  • 需要自己处理superclass的observe事务
  • 多次相同KVO的removeObserve会导致crash

参考

http://tech.glowing.com/cn/implement-kvo/
http://www.jianshu.com/p/70b2503d5fd1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,885评论 0 9
  • 一、什么是KVO KVO和Notification是Objective-C语言中观察者模式的两种实现机制。KVO指...
    坤坤同学阅读 2,425评论 0 0
  • 一、概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察...
    DeerRun阅读 13,402评论 11 33
  • 本篇会对KVO的实现进行探究,不涉及太多KVO的使用方法,但是会有一些使用时的思考。 一、使用上的疑问 1.key...
    奋拓达阅读 3,496评论 0 2
  • 梦里浅笑嫣然的你 抓不住我的伤痕 我拼命的奔跑 争分夺秒 飞沙走石 狂风呼啸 万马奔腾 抓不住你的影子 追...
    青衫落磊险峰行阅读 2,338评论 0 1

友情链接更多精彩内容