美文网首页
KVO的本质

KVO的本质

作者: aaayia | 来源:发表于2018-11-20 20:42 被阅读19次

KVO 是 Objective-C 对观察者模式的实现。也是 Cocoa Binding 的基础。当被观察对象的某个属性发生更改时,观察者对象会获得通知。

Apple 的文档对KVO的解释:

被观察对象的 isa 指针会指向一个中间类,而不是原来真正的类。

实际上,当你观察一个对象时,一个中间类会被runtime创建出来,新创建出的类继承自该对象的原本的类。并重写的setter方法,重写的 setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象值的更改。并使这个对象isa指针指向了生成的中间类。

@interface Person : NSObject
@property (assign, nonatomic) int age;
@end

如果观察 Personage属性。

  1. 系统会在运行时生成NSKVONotifying_Person

  2. NSKVONotifying_Person中重写setterclassdealloc等方法。

  3. 使Person实例对象的isa指针指向
    NSKVONotifying_Person

  4. NSKVONotifying_Person的superclass指向Person

生成的中间类的大致结构:

NSKVONotifying_Person
isa
superclass
setage
class
dealloc
_isKVOA

重写的class方法会直接返回Person

- (Class)class
{
    return [MJPerson class];
}

在重写的NSKVONotifying_Person的-setAge方法中会调用_NSSetIntValueAndNotify

- (void)setAge:(int)age
{
    _NSSetIntValueAndNotify();
}

因为_NSSetIntValueAndNotify在Foundation框架中,无法查看起具体实现,根据实践猜测大致为代码如下:

void _NSSetIntValueAndNotify()
{
    [self willChangeValueForKey:@"age"];
    [super setAge:age];
    [self didChangeValueForKey:@"age"];
}

- (void)didChangeValueForKey:(NSString *)key
{
    // 通知监听器,某某属性值发生了改变
    [oberser observeValueForKeyPath:key ofObject:self change:nil context:nil];
}

注:Foundation框架中类似_NSSetIntValueAndNotify的方法实现还有很多:

__NSSetBoolValueAndNotify
__NSSetCharValueAndNotify
__NSSetDoubleValueAndNotify
__NSSetFloatValueAndNotify
__NSSetIntValueAndNotify
__NSSetLongLongValueAndNotify
__NSSetLongValueAndNotify
__NSSet0bjectValueAndNotify
__NSSetPointValueAndNotify
__NSSetRangeValueAndNotify
__NSSetRectValueAndNotify
__NSSetShortValueAndNotify
__NSSetSizeValueAndNotify

参考:

相关文章

  • Objective-C的本质(4)—— KVO本质

    参考:iOS底层原理总结 - 探寻KVO本质iOS-KVO本质 问题一:kvo如果找到对应的属性 KVO不存在查找...

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • 深入理解KVO

    iOS | KVO | Objective-C KVO的本质是什么,如何手动触发KVO? 1.什么是KVO KVO...

  • 04. KVO使用,原理,本质

    问题 KVO日常使用 KVO原理(KVO本质是什么) 如何手动触发KVO 直接修改成员变量会触发KVO吗 KVO图...

  • KVO

    0:KVO的使用步骤 1:KVO本质 methodForSelector方法 NSKVONotifying_Per...

  • 探索中的KVO

    探索KVO的本质 什么是KVO KVO的全称就是Key-Value Observing ,俗称“键值监听”。用于监...

  • iOS KVO

    什么是KVO KVO俗称“键值监听”,用来监听某个对象属性值的改变 KVO的使用 KVO 本质 在给某个对象添加K...

  • iOS-KVO本质

    参考篇:iOS-KVO浅谈 前言:本文简述KVO本质,如有错误请留言指正。 什么是KVO? KVO的全称是Key-...

  • 03-OC中KVO的底层原理

    KVO本质 什么是KVO? KVO:Key-Value Observing,用来监听类的某个对象的某个属性的值发生...

  • 小码哥底层原理笔记:KVO的本质

    使用KVO主要是监听属性的变化。简单的KVO如下: KVO的本质 当我们给person1增加KVO后修改age的值...

网友评论

      本文标题:KVO的本质

      本文链接:https://www.haomeiwen.com/subject/ddcfqqtx.html