MJiOS底层笔记--KVO本质
本文屬筆記性質,主要針對自己理解不太透徹的地方進行記錄。
推薦系統直接學習小碼哥iOS底層原理班---MJ老師的課確實不錯,強推一波。
NSKVONotifying_Person
KVO時,將被監聽的對象isa指針動態修改成新類NSKVONotifying_Person
在對一個(Person)instance對象使用KVO進行監聽時,系統利用RuntimeAPI動態生成一個(Person的)子類,并且讓(Person)instance對象的isa指向這個全新的子類
NSKVONotifying_Person內部
- isa
指向NSKVONotifying_Person內部元類,提供方法實現
- superClass、class
為了掩蓋NSKVONotifying_Person的存在,修改了這兩個方法。使其結果與Person類返回的相同。
Class cls = object_getClass(self.person1); Class spcls =class_getSuperclass(cls); NSLog(@"object_getClass==%@",cls); NSLog(@"class==%@",[self.person1 class]); NSLog(@"class_getSuperclass==%@",spcls); NSLog(@"superclass==%@",[self.person1 superclass]);//打印 object_getClass==NSKVONotifying_MJPerson class==MJPerson class_getSuperclass==MJPerson superclass==NSObject 復制代碼- dealloc
做一些收尾工作
- isKVOA
鑒定是否被KVO
_NSSetXXXValueAndNotify
被監聽對象屬性的set方法IMP指針所指方法
Foundation下的一個C語言函數,當調用被監聽對象屬性的set方法時,實際上將會調用這個C語言方法。
其內部將會調用一系列方法修改成員變量并且觸發監
- (void)setAge:(int)age {_NSSetIntValueAndNotify(); }// 偽代碼 void _NSSetIntValueAndNotify() {[self willChangeValueForKey:@"age"];[super setAge:age];[self didChangeValueForKey:@"age"]; } 復制代碼willChangeValueForKey && didChangeValueForKey
觸發監聽的方法。可以手動調用以主動觸發監聽
- 只有被監聽的屬性被修改,才會調用這個方法
未被監聽的屬性修改不會觸發
- 兩個方法需要配對使用
只調用didChangeValueForKey不會觸發監聽
KVO觸發條件
通過set方法為屬性賦值
直接修改成員變量不會觸發監聽
KVC與KVO
KVC賦值是可以觸發KVO的
并且,KVC內部實現了通知邏輯(willChangeValueForKey&&didChangeValueForKey)。即使沒有實現set方法,也能被通知。
KVC賦值過程
其中accessInstanceVariablesDirectly默認返回YES
KVC取值過程
其中accessInstanceVariablesDirectly默認返回YES
總結
以上是生活随笔為你收集整理的MJiOS底层笔记--KVO本质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试的艺术第三章总结
- 下一篇: 最前线|阿里大文娱板块Q3营收同比增长2