本文屬筆記性質,主要針對本身理解不太透徹的地方進行記錄。ios
推薦系統直接學習小碼哥iOS底層原理班---MJ老師的課確實不錯,強推一波。bash
KVO時,將被監聽的對象isa指針動態修改爲新類
NSKVONotifying_Person
函數
在對一個(Person
)instance對象使用KVO進行監聽時,系統利用RuntimeAPI動態生成一個(Person
的)子類,而且讓(Person
)instance對象的isa指向這個全新的子類學習
指向NSKVONotifying_Person內部
元類,提供方法實現ui
爲了掩蓋
NSKVONotifying_Person
的存在,修改了這兩個方法。使其結果與Person
類返回的相同。spa
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
複製代碼
作一些收尾工做3d
鑑定是否被KVO指針
被監聽對象屬性的set方法IMP指針所指方法code
Foundation下的一個C語言函數,當調用被監聽對象屬性的set方法時,實際上將會調用這個C語言方法。cdn
其內部將會調用一系列方法修改爲員變量而且觸發監
- (void)setAge:(int)age
{
_NSSetIntValueAndNotify();
}
// 僞代碼
void _NSSetIntValueAndNotify()
{
[self willChangeValueForKey:@"age"];
[super setAge:age];
[self didChangeValueForKey:@"age"];
}
複製代碼
觸發監聽的方法。能夠手動調用以主動觸發監聽
未被監聽的屬性修改不會觸發
只調用didChangeValueForKey
不會觸發監聽
經過set方法爲屬性賦值
直接修改爲員變量不會觸發監聽
而且,KVC內部實現了通知邏輯(willChangeValueForKey
&&didChangeValueForKey
)。即便沒有實現set方法,也能被通知。
其中accessInstanceVariablesDirectly
默認返回YES
其中accessInstanceVariablesDirectly
默認返回YES