KVO 和 KVC
2019-04-13 本文已影响0人
李庶庶
1.KVC
KVC即指NSKeyValueCoding, 一种可以通过key的名称间接访问property的机制
UIFont *font = [[self label] font];
UIFont *font2 = [[self valueForKey:@"label"] valueForKey:@"font"];
UIFont *font3 = [self valueForKeyPath:@"label.font"];
以上三行代码等价,留意keyPath的用法
[self setValue:[UIColor yellowColor] forKeyPath:@"label.backgroundColor"];
2.KVO
KVO即Key-Value Observing,是建立在KVC基础上的,一种可以观察对象keyPath对应值变化的机制。
KVO的是通过isa-swizzling实现的,流程如下:编译器自动为被观察对象创建一个派生类(NSKVONotifying_XXX),并将被观察对象的isa指向这个派生类。如果用户注册了对此对象某一个属性的观察,此派生类会重写该属性的set方法,并添加响应的通知代码。Objective-C在发送消息时,会通过isa指针找到当前对象所属的类对象,向此对象发送消息的时候,实际发送到了派生类override的方法,且其中有通知代码。因此会向observer发送通知。
[[Person sharedInstance] addObserver:self.label forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
NSLog(@"%@", [[Person sharedInstance] class]);
//打印isa指针
NSLog(@"%@", object_getClass([Person sharedInstance]));
WPSafeKVO[7368:385349] Person
WPSafeKVO[7368:385349] NSKVONotifying_Person
3.KVO使用时的注意点
1.addObserver 和 removeObserver必须成对出现,不论是少移除还是重复移除,都会导致crash