美文网首页
KVO中运用的isa混写技术

KVO中运用的isa混写技术

作者: 小苗晓雪 | 来源:发表于2018-08-20 10:55 被阅读16次
    - (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;
    }
    

    愿编程让这个世界更美好

    相关文章

      网友评论

          本文标题:KVO中运用的isa混写技术

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