KVO原理

研究KVO的时候我们发现系统使用Objective-C 强大的runtime功能实现了这个功能。属性类class中并没有实现KVO通知的相关方案,而是在调用addObserver之后定义属性类的子类subclass,subclass里边实现了属性的setter方法,setter方法中实现发动通知的功能。然后subclass中实现class函数,还让返回属性类的class,再让属性类对象的isa指向subclass,这样就伪装成表面上看还是属性类自己实现的通知功能。通过原理我们可以看出, 必须使用属性方法或者setValue:forKey方法赋值才会发送通知,直接赋值是不会收到通知的。

实际上系统定了一个叫做  NSKVONotifying_ClassTest的子类,子类中实现了

setY: , setX: , class , dealloc , _isKVOA函数,这个 _isKVOA函数应该是个私有函数,用来判断是否kvo框架生成的类, x, y, xy对象的运行时类都指向NSKVONotifying_ClassTest,通过class函数返回的类还是指向ClassTest,但是control对象的不管运行时类还是class函数返回的类都指向 ClassTest。这样就验证了系统是通过定义Classtest类的子类来实现属性方法发送通知的,系统很聪明,子类中并没有实现setZ方法,因为我们并没有对属性z添加观察者。

Objective-C 之 isa

 

每个 Objective C 对象有个指向其具体类的指针   isa 。但 Objective-C 是一 种运行时动态特性很强的语言。换句话说, Objective-C 的运行时动态特性决 定了某个对象在生命周期内,其所属的类是可能改变的,也就是 isa 指针有可 能改变, Apple 把这种技术叫做 IsA-swizzling 。举个例子,当对某个对象使 用了 KVO 之后, Objective-C 实际上是动态的创建了一个该对象所属类的子 类,并把该对象的所属类指向这个子类。这时候该对象的 isa 指针就很不幸的 被改变了。实际上, isa 指针是 Objective-C 运行时系统使用到的一个变量 ,我们在程序中应该尽量不要依赖它。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值