KVO中运用的isa混写技术

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    
    MObject *obj = [[MObject alloc] init];
    MObserver *observer = [[MObserver alloc] init];
    
    // 获取isa指针:
    const char *isaPointClass = object_getClassName(obj);
    NSLog(@"isaPointClass = %s" , isaPointClass);
    // isaPointClass = MObject
    
    //调用kvo方法监听obj的value属性的变化:
    [obj addObserver:observer forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL];
    const char *newIsaPointClass = object_getClassName(obj);
    NSLog(@"newIsaPointClass = %s" , newIsaPointClass);
    // newIsaPointClass = NSKVONotifying_MObject
    
    /**
     *  所以 , KVO运用了 isa指针 的混写技术~在添加完观察者之后 
        把被观察对象的isa指针指向了一个新的动态创建的 , 
        继承自被观察者的 NSKVONotifying_MObject 类 ! , 
        在这个新的动态创建类中去重写setter方法 , 从而达到监听的效果~
     
     */
    
    //通过setter方法修改value
    obj.value = 1;
    
    // 1 通过kvc设置value能否生效?
    [obj setValue:@2 forKey:@"value"];
    
    // 2. 通过成员变量直接赋值value能否生效?
    [obj increase];
    
    return YES;
}

愿编程让这个世界更美好

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

相关阅读更多精彩内容

友情链接更多精彩内容