1梨撞、如果你給一個Person實例添加KVO燥滑,那么這個實例的的isa指針指向的是派生出來了NSKVONotification_Person類對象渐北,折耳根類對象是Runtime動態(tài)創(chuàng)建出來的,只要添加了KVO就會創(chuàng)建铭拧,他只是Person的一個子類赃蛛,NSKVONotification_Person的superclass指向的還是Person這個類
2、NSKVONotification_Person中重寫了你監(jiān)聽屬性的set方法搀菩,這個set方法調(diào)用了NSSetInt(XXX類型而已)ValueAndNotify方法
3呕臂、NSSetInt(XXX類型而已)ValueAndNotify方法的實現(xiàn)
[self willChangeValueForKey];
[super setAge:age];//調(diào)用父類的set方法
[self didChangeValueForKey];
4、didChangeValueForKey 這個方法會調(diào)用監(jiān)聽起的observeValueForkeyPath方法
5肪跋、派生類NSKVONotification_Person中除了有重寫setAge方法歧蒋,還有dealloc? classs? _isKVO 方法
KVO的本質(zhì)
1、利用Runtime給對象的類添加一個NSKVONotification_XXX的派生類,并且讓這個實例對象的isa指針指向這個派生類
2疏尿、當(dāng)被監(jiān)聽的屬性發(fā)生改變時,會通過實例的isa指針找到這個派生類易桃,調(diào)用派生類里面的set方法
3褥琐、派生類中的set方法調(diào)用了NSSetXXXValueAndNotify方法
4、NSSetXXXValueAndNotify這個方法中又調(diào)用了
willChangeValueForKey
[super setXXX:]
didChangeValueForKey;
5晤郑、didChangeValueForKey中又調(diào)用了observer的observerValueForKeyPayh方法
手動觸發(fā)KVO
可以自己手動調(diào)用willChangeValueForKey 和 didChangeValueForKey
直接誒修改成員變量的值(person->age = 10)敌呈,是不會掉用KVO的,因為沒有調(diào)用set方法造寝,如果你要能夠監(jiān)聽到KVO磕洪,那么你需要手動調(diào)用willChangeValueForKey 和?didChangeValueForKey