本文属笔记性质,主要针对本身理解不太透彻的地方进行记录。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