iOS KVO原理分析

通过断点可以看到已经被监听的类的isa指针:

(lldb) p self.person->isa
(Class) $0 = NSKVONotifying_WPPerson

问题是NSKVONotifying_WPPerson何时来的,我尝试在添加监听之前还有之后分别打印NSClassFromString(@"NSKVONotifying_WPPerson")发现NSKVONotifying_WPPerson是在添加观察者之后被创建的.

通过打印NSKVONotifying_WPPerson这个类的方法列表:

- (void)printMethods:(Class)class{
    unsigned int count = 0;
    Method *methods = class_copyMethodList(class, &count);
    for (int i = 0; i < count; i++) {
        Method method = methods[i];
        SEL sel = method_getName(method);
        IMP imp = method_getImplementation(method);
        NSString *methodName = NSStringFromSelector(sel);
        NSLog(@"%@",methodName);
    }
}

2019-01-14 16:11:27.591359+0800 KVO_learn[35003:466572] setArray:
2019-01-14 16:11:36.150872+0800 KVO_learn[35003:466572] class
2019-01-14 16:11:40.639886+0800 KVO_learn[35003:466572] dealloc
2019-01-14 16:22:35.932556+0800 KVO_learn[35003:466572] _isKVOA

断点发现IMP都是指向Foundition框架的

一般的内部执行过程是:

NSKeyValueWillChange
[WPPerson setSteps:]
NSKeyValueDIdChange
NSKeyValueNotifyObserver
observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change
主要注意的是移除观察者时:

1:移除之后isa指针指向了WPPerson
2:但是NSKVONotifying_WPPerson这个类已经被注册过了,不会被销毁,只是ISA指针改变了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    暮年古稀ZC阅读 2,181评论 2 9
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,789评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 一、概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察...
    DeerRun阅读 10,134评论 11 33
  • 这是一条简单的霍金时间线。 1942年1月8日: 史蒂芬·霍金出生于英国牛津。这天刚好是现代科学之父伽利略·伽利莱...
    张三李四某阅读 674评论 0 6