KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现。也是 Cocoa Binding 的基础。当被观察对象的某个属性发生更改时,观察者对象会得到通知。ui
有意思的是,你不须要给被观察的对象添加任何额外代码,就能使用 KVO 。这是怎么作到的?指针
第一次被观察
时,系统就会在运行期动态
地建立该类的一个派生类
,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制
NSKVONotifying_Person
willChangeValueForKey:
和 didChangevlueForKey:
;在一个被观察属性发生改变以前, willChangeValueForKey:
必定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:
会被调用,继而 observeValueForKey:ofObject:change:context:
也会被调用。补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让咱们误认为仍是使用的当前类,从而达到隐藏生成的派生类code
KVC运用了一个isa-swizzling技术. isa-swizzling就是类型混合指针机制, 将2个对象的isa指针互相调换, 就是俗称的黑魔法.
KVC主要经过isa-swizzling, 来实现其内部查找定位的. 默认的实现方法�由NSOject提供isa指针, 如其名称所指,(就是is a kind of的意思), 指向分发表对象的类. 该分发表实际上包含了指向实现类中的方法的指针, 和其它数据。server
- 具体主要分为三大步
- 或者这么说
好比说以下的一行KVC的代码:对象
[object setValue:@"13123" forKey:@"uuid"]; 就会被编译器处理成: // 首先找到对应sel SEL sel = sel_get_ uuid("setValue:forKey:"); // 根据object->isa找到sel对应的IMP实现指针 IMP method = objc_msg_lookup (object->isa,sel); // 调用指针完成KVC赋值 method(object, sel, @"13123", @"uuid");