当给一个对象添加了监听器的话,当不使用这个对象的时候,需要移除监听器
由上图可以出,person1的类对象变成了NSKVONotifying_MJPerson
person2的类对象还是MJPerson
NSKVNotifying_MJPerson是是用runtime动态创建的一个类,是MJPerson的子类
IMP就是方法的实现。runtime里面有一个方法叫methodForSelector:(SEL),这方法的含义就是:只要传一个方法名进去,就会告诉你方法的具体实现在哪。打印下方法的内存地址,就知道那个方法在哪
NSObject 的class现实应该是
-
(Class)class {
return object_getClass(self);返回的是对象的真实类型
}
所以动态生成的派生类,重写class方法的目的是为了隐藏NSKVONotifying_MJPerson类的存在,也就是隐藏内部实现
直接修改成员变量不会触发KVO,因为KVO的本质是重写set方法。但是我们可以通过上图手动触发KVO,在修改成员变量的时候,也能触发监听器的监听方法。
上图中的两行代码完全等价
KVC直接修改成员变量也是可以触发KVO的
KVC内部有做KVO监听的一个相关操作
也就是KVC还是能触发KVO,我就不管你有没有调用set方法
KVC的底层现实可以理解为上图
-
(BOOL)accessInstanceVariablesDirectly方法默认返回的是YES,也就是说默认是可以直接访问对象的成员变量的
网友评论