_NSSet**ValueAndNotify的内部实现
1. 基本使用
- 添加观察者
[self.p addObserver:self forKeyPath:@"name" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
// context : 标签 -- 区分
// context:<#(nullable void *)#>
/*
比如两个类, B类继承于A类,有同样的属性,且都需要被观察,那么监听方法里就需要判断判断实例的类,和属性,需要if嵌套
使用context : 传入@"A_name""B_name",只要判断context就可以了
1.嵌套少
2.性能高
*/
- 实现监听方法,观察响应回调
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSLog(@"%@",change);
}
- 移除观察者
[self.p removeObserver:self forKeyPath:@"name"];
如果不移除观察者,存在隐患,如果观察者已经销毁了,而被观察的对象没有销毁,然后产生了KVO message,这时就抛异常了,EXC_BAD_ACCESS
2. 手动调用监听
[self.p willChangeValueForKey:@"name"];
[self.p didChangeValueForKey:@"name"];
3.面试题
1.iOS用什么方式实现一个对象的KVO(KVO的本质是什么)?
- 利用runtime动态创建一个当前类的子类.
- 把当前对象的isa指针指向这个动态创建的子类.
- 当修改对象的属性时,会调用Foundation的_NSSetxxxxValueAndNotify函数
- willChangeValueForKey:
- 父类原来的setter方法
- didChangeValueForKey: 内部会触发监听器(Observer)的监听方法
2. 如何手动触发KVO
手动调用willChangeValueForKey:和didChangeValueForKey:
3.直接修改成员变量触发KVO吗?
不会
本文详细介绍了iOS中的Key-Value Observing (KVO)机制,包括基本使用、手动触发KVO的方法以及相关面试题解答。通过KVO,可以监听对象属性变化并在属性改变时执行相应操作。注意在不再需要监听时移除观察者,以避免内存问题。手动触发KVO需调用`willChangeValueForKey:`和`didChangeValueForKey:`。直接修改成员变量不会触发KVO。


1363

被折叠的 条评论
为什么被折叠?



