A原理/底层iOSiOS Developer

KVC、KVO探识(六)KVO底层实现原理

2016-03-29  本文已影响1507人  Peak_One
前言

KVO的用法前面已经讲过了,不懂得可以去看我的KVC、KVO探识(一),希望会对你有帮助。今天主要讲KVC、KVO的底层实现……因为之前我也不懂,所以很有必要记录一下。

准备工作

KVO是基于观察者设计模式来实现的。
观察者模式:一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象。这个主动通知通常是通过调用各观察者对象所提供的接口方法来实现的。观察者模式较完美地将目标对象与观察者对象解耦。

手动实现键值观察(代码示例)

被观察的对象Target(重写setter/getter方法)
Target.h

@interface Target : NSObject
{
   int age;
}
// for manual KVO 
- age- (int) age;
- (void) setAge:(int)theAge;
@end

Target.m

@implementation Target
- (id) init{ 
    self = [super init]; 
    if (nil != self) { 
          age = 10; 
     } 
    return self;
}
// for manual KVO - age
- (int) age{
    return age;
}
- (void) setAge:(int)theAge{ 
    [self willChangeValueForKey:@"age"];
    age = theAge; 
    [self didChangeValueForKey:@"age"];
}
+ (BOOL) automaticallyNotifiesObserversForKey:(NSString *)key { 
    if ([key isEqualToString:@"age"]) {
     return NO;
 } 
return [super automaticallyNotifiesObserversForKey:key]**;
}
@end

首先,需要手动实现属性的 setter 方法,并在设置操作的前后分别调用 **willChangeValueForKey: **和 didChangeValueForKey方法,这两个方法用于通知系统该 key 的属性值即将和已经变更了;
其次,要实现类方法 automaticallyNotifiesObserversForKey,并在其中设置对该 key 不自动发送通知(返回 NO 即可)。这里要注意,对其它非手动实现的 key,要转交给 super 来处理。

实现原理

KVO的实现是基于runtime运行时的,下面就来详细介绍一下原理:还是这张图:


1678515-21e42e5bd141b750.png
上一篇下一篇

猜你喜欢

热点阅读