KVO实现原理(本质)

KVO - 键值监听,用于监听对象属性值的变化

图片.png

断点调试
addObserver前后的怕p1 isa所指类对象不一样,NSKVONotifyin_Person是runtime在运行时生成的一个Person的子类,那么就是说其superclass指针指向Person类对象
图片.png

p1在监听前后setAge的地址发生了变化
图片.png

iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
答. 当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,改为指向一个全新的通过Runtime动态创建的子类,子类拥有自己的set方法实现,set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、didChangeValueForKey方法,而didChangeValueForKey方法内部又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法。

KVO的触发一定离不开willChangeValueForKeydidChangeValueForKey这两个方法

 * 获取对象方法列表
 */
- (void)printMethodNamesOfClass:(Class)cls{
    unsigned int count;
    /// 获取方法数组
    Method *methodList = class_copyMethodList(cls, &count);
    
    /// 存储方法名
    NSMutableString *methodNames = [NSMutableString string];
    
    /// 遍历所有的方法
    for (int i = 0; i < count; i++) {
        /// 获取方法
        Method method = methodList[i];   /// 指针当做数组用。
        NSString *methodName = NSStringFromSelector( method_getName(method));
        [methodNames appendFormat:@"%@, ", methodName];
    }
    
    /// 释放  C语言需要释放
    free(methodList);
    
    /// 打印方法名
    NSLog(@"%@  %@", cls, methodNames);
}

简单的记录学习一下
参考:https://www.jianshu.com/p/5477cf91bb32

你可能感兴趣的:(KVO实现原理(本质))