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 指正指向他的类对象,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值