初探KVO

匿名 (未验证) 提交于 2019-12-03 00:22:01

概述


KVO 的具体实现

具体实现代码如下:

 #import "ViewController.h" #import "Person.h"  @interface ViewController () /** p1 */ @property (strong, nonatomic) Person *p1;  @end  @implementation ViewController  - (void)viewDidLoad { super viewDidLoad]; // 1.什么是通知  // 3个对象 self.p1 = [[Person alloc] init]; self.p1.name = @"p1";  // KVO是监听对象的属性值的改变的 self.p1 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; self.p1.name = @"123";  }  // 这个方法时属于 NSObject 类的,任何对象都可以作为观察者 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { NSLog(@"监听到了%@的%@属性发生了改变", object, keyPath); NSLog(@"%@", change); }  @end 
打印结果: 2014-05-11 19:55:34.319 KVO和KVC和通知代理[559:109378] 监听到了<Person: 0x15ee2baa0>的name属性发生了改变 2014-05-11 19:55:34.320 KVO和KVC和通知代理[559:109378] 123 

KVO 的实现原理

KVO 是基于运行时实现的

isa	Class	NSKVONotifying_Person	0x000001a12de2f545 

p1.nameNSKVONotifying_PersonNSKVONotifying_Person-setName:

 - (void)setName:(NSString *)name { super setName:name];  // 这两个方法底层会调用observer的- (void)observeValueForKeyPath: ofObject: change: context:这个方法 self willChangeValueForKey:@"age"]; self didChangeValueForKey:@"age"]; }
文章来源: 初探KVO
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!