KVO(键值监听)
作用:用于做属性监听,也可以利用属性set方法在内部监听
实现原理
- KVO是基于runtime机制实现的
- 当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。
- 派生类在被重写的 setter 方法实现真正的通知机制(Personà NSKVONotifying_Person)
实例
- 1.2.1 替属性注册监听
1 | - (void)KVO |
1.2.2 释放监听器
两种方式删除指定key路径的监听器
- removeObserver: forKeyPath
- removeObserver: forKeyPath: context:
1 | - (void)dealloc |
- 1.2.3 回调:当被监听的属性的值改变时调用
1 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context |
KVC(键值编码)
- 1.可以访问私有成员变量的值
- 2.可以间接修改私有成员变量的值(替换系统自带的导航栏、tabbar)
访问属性
公有属性
私有属性
1 | Person *p = [[Person alloc] init]; |
修改私有属性(readonly)
1 | [pageControl setValue:[UIImage |
- forKey和forKeyPath区别
keyPath包含了key的功能
key:只能访问当前对象的属性
keyPath:能利用.运算符一层一层往内部访问属性
1 | // 两者都可以访问属性 |
其他
计算数组长度,元素和
1 | Book *b3 = [[Book alloc] init]; |