KVO总结

KVO是键值对观察,是NSObject的非常正式协议。当创建一个类对象中的属性进行观察的时候,其实在运行的时候,自动创建一个NSKVONotifying_XX这个类,对外界是不可见的,这个类是是用runtime进行创建,导致很多操作,不是类本身,而是NSKVONotifying_XX。NSKVONotifying_XX是XX的子类,当你改变值的时候,就会发消息给NSKVONotifying_XX这个类,如果当前类没有这个变量,就会往父类进行查询,一直查找到根类NSObject。

如果一个类的对象没有被观察和被观察,isa的值是不一样的,这个要注意。一般情况下,自动观察。如果想手动观察的时候,+ (BOOL)automaticallyNotifiesObserversForKey:(NSString*)key,就可以在方法中进行设置。

- (void)addObserver:(NSObject*)observer forKeyPath:(NSString*)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void*)context

observer:是被观察的对象

keyPath:观察的属性

NSKeyValueObservingOptions:

NSKeyValueObservingOptionNew//修改字典中对应属性新值。

NSKeyValueObservingOptionOld//修改字典中对应属性旧值。

NSKeyValueObservingOptionInitial//注册方法的时候,直接调用,一般在选项中不能直接增加这个选项,都是新值。

NSKeyValueObservingOptionPrior//在发送通知之前和发送之后,都会调用一次

其中,这些可以组合使用。

context:上下文,这个是可以是任意可以转换值。


- (void)observeValueForKeyPath:(nullableNSString*)keyPath ofObject:(nullableid)object change:(nullableNSDictionary *)change context:(nullablevoid*)context

keyPath:属性的名

object:被观察的对象

change:改变的值

context:上下文,这个是可以是任意可以转换值

这个可以一对一或一对多进行观察。当设置属性的时候,如果属性方法实现了,可以在内面willChangeValueForKey:(NSString*)key和didChangeValueForKey:(NSString*)key的方法,当调用完成后,才调用- (void)observeValueForKeyPath:(nullableNSString*)keyPath ofObject:(nullableid)object change:(nullableNSDictionary *)change context:(nullablevoid*)context这个方法。

- (void)removeObserver:(NSObject*)observer forKeyPath:(NSString*)keyPath

使用完了,一定要移除。如果不移除,会崩溃的。

kvc和kvo比较:

kvc是键值对编码,kvo键值对观察。

kvc在设置值和获取值的时候,如果当前有这个属性的时候,会进行设置;如果当前没有这个属性的时候,就要进行搜索,其中在搜索之前,要看accessInstanceVariablesDirectly是Yes的时候,才能进行搜索链,这个在操作属性的时候,如果找到,就会设置,找不到,就进入到没有的方法中;如果accessInstanceVariablesDirectly是NO的时候,直接返回没有定义这个属性。kvc不会创建新类。

kvo是对值的观察,如果值改变的时候,就会在底层创建一个新类,对新类进行操作。

kvo和kvc都是在同一个线程中使用,不能在多线程中使用。如果在多线程中使用会出问题。

kvo和NSNotification区别:

kvo是属性观察,NSNotification是对一个model和view之间进行观察。kvo只能在一个线程中,NSNotification可以在多线程中使用。

你可能感兴趣的:(KVO总结)