故事描述:很久很久以前,在狗ali边上有一家公司,在这家公司有一个帅气的高大的头发长且茂盛的iOS软件工程师,有一天他要做一个直播的需求,直播接的七牛云的SDK,他想去通过KVO去监听SDK中 session对象的焦点发生改变的回调。但是没卵用,这个iOS就在想,为什么呢,是我写的不对吗,他就换个属性监听,发现没问题啊,然后我就查阅资料,发现了一个惊天大秘密 (未完待续...)
回忆:这个帅气的iOS就在想,KVO 的流程 和原理
KVO通过某个对象的某个值 触发 【change value for key】时,触发回调
那 会不会是 赋值时没有触发 KVC
然后试了一下 某个对象的 self.age = 100; 和 _age = 100;
发现前者可以 监听到 后者 不能
这个帅气的iOS就又再想 这本质有啥区别呢,他就想到老师讲的:
self.age (属性)会让实例变量 触发 setter 和 getter 方法 setter:[self setAge:100]
_age 只是个实例变量 访问时比属性访问快
科普:
KVC的全称是Key-Value Coding(键值编码),是由NSKeyValueCoding非正式协议启用的一种机制,对象采用这种机制来提供对其属性的间接访问,可以通过字符串来访问一个对象的成员变量或其关联的存取方法(getter or setter)
结论 _age没有触发 setter 和 getter ,所以KVO 监听不到KVC 变化
所以这个惊天大秘密就是:狗七牛写Bug! he~ tui ~
完.