当使用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指针->原类 改为 -> 派生类