美文网首页
KVO 和 KVC

KVO 和 KVC

作者: 李庶庶 | 来源:发表于2019-04-13 12:29 被阅读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

相关文章

网友评论

      本文标题:KVO 和 KVC

      本文链接:https://www.haomeiwen.com/subject/gqulwqtx.html