<pre>
// KVO的本質(zhì)就是監(jiān)聽一個(gè)對(duì)象有沒有調(diào)用set方法
//不使用@property的聲明的屬性是不會(huì)自動(dòng)生成set與get方法 在這里_p ->_name 是調(diào)用_name的get方法 此時(shí)KVO 就監(jiān)聽不到_p的屬性_name的改變
_p -> _name = i;
Person *p = [[Person alloc] init];
// 監(jiān)聽name屬性有沒有改變
[p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
_p = p;
通過重寫KVO的- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context;方法可以對(duì)沒有用property聲明的對(duì)象進(jìn)行監(jiān)聽 ,近而了解KVO的底層實(shí)現(xiàn)
</pre>
<pre>
/*
// 1.自定義NSKVONotifying_Person子類
// 2.重寫setName,在內(nèi)部恢復(fù)父類做法,通知觀察者
// 3.如何讓外界調(diào)用自定義Person類的子類方法,修改當(dāng)前對(duì)象的isa指針,指向NSKVONotifying_Person
*/
// 把觀察者保存到當(dāng)前對(duì)象
objc_setAssociatedObject(self, (__bridge const void *)(observerKey), observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
// 修改對(duì)象isa指針
object_setClass(self, [XZYKVONotifying_Person class]);
// 通知觀察者調(diào)用observeValueForKeyPath
// 需要把觀察者保存到當(dāng)前對(duì)象
// 獲取觀察者
id obsetver = objc_getAssociatedObject(self, observerKey);
[obsetver observeValueForKeyPath:@"name" ofObject:self change:nil context:nil];
使用自定義的方法
Person *p = [[Person alloc]init];
[p xzy_addObserver:self forKeyPath:@"name" options:0 context:nil];
實(shí)現(xiàn)KVO的監(jiān)聽
</pre>