iOS之KVO

简介: 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 原理

如图:

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章