iOS_KVO的实现

2022-07-20 13:52:39 浏览数 (2)

当使用KVO观察一个对象时,runtime会动态创建其子类,并将这个对象的isa指针指向子类;

子类会重写setter方法,内部会顺序调用 willChangeValueForKey 、原来的setter方法、 didChangeValueForKey (内部会调用监听器的回调方法:observerValueForKeyPath:ofObject:context)

- ( void ) setName :( NSString *)newName{

  [ self willChangeValueForKey : @"name" ];

  [ super setValue :newName forKey : @"name" ];

  [ self didChangeValueForKey : @"name" ];

}

系统为了隐藏子类,会重写子类的class方法,直接返回父类

- ( Class ) class {

// 得到类对象,在找到类对象父类

return class_getSuperclass ( object_getClass ( self ));

}

  • 是怎么实现只对当前实例有效的?

当前对象的 isa指针->原类  改为 -> 派生类

0 人点赞