KVO中运用的isa混写技术

2018-08-20  本文已影响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;
}

愿编程让这个世界更美好

上一篇下一篇

猜你喜欢

热点阅读