欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS之KVO

程序员文章站 2022-04-13 12:25:54
...

简介: KVO的全称是Key-Value Observing , 翻译过来就是键值监听,可以用于监听某个对象属性值的改变。

常用API : 

          1: 添加观察者: addObserve:forKeyPatch:option:context:

          2:实现观察相应方法: observeValueForKeyPath:ofObject:change:context

          3:在观察者释放之前移除对象上的监听: removeObserver:forKeyPath:

 

关联监听:

// .h 中有一个 fullName 属性, 他是有其他两个属性组成的, _firstName、 _lastName 他两的变化影响着 fullName 最终结果。 所以 + (NSSet*) keyPathsForValuesAffectingFullName 方法可以吧相关联属性添加进去,
 



- (NSString*)fullName {
    return [NSString stringWithFormat:@"%@ %@", _firstName, _lastName];
}

+ (NSSet*) keyPathsForValuesAffectingFullName
{
    return [NSSet setWithObjects:@"lastName", @"firstName", nil];
}

自动/手动监听

+ (BOOL) automaticallyNotifiesObserversOfSteps {
    return NO;
}

监听对象中如果设置为No, 那么将会关闭自动监听,如果要使用手动监听,那么:

    [_p willChangeValueForKey:@"被观察属性"];
    _p.被观察属性 = 新值
    [_p didChangeValueForKey:@"被观察属性"];

KVO 原理

如图:

iOS之KVOiOS之KVO

*    未被观察的对象:   它的实例对象isa 指针指向他的类对象,从他的类对象缓存和方法列表中寻找方法实现。

*    被观察的对象 :在添加观察者的时候动态生成了一个类NSKVONotifying_Class 并且 被观察类的实例对象 把isa指针指向了动态生成的这个类。当实例调用方法的时候调用了NSKVONotifying_Class 子类的方法,方法实现调用了foundation 框架中_NSSetIntValueAndNotify 方法,set方法只要做了两件事 1.改变父类的值  2.然后通知.

*  removeObserver:forKeyPath 移除观察者其实就是类对象把他的isa 指正指向他的类对象,

相关标签: KVO iOSKVO