标签:
涉及到了runtime,关于isa指针
手动实现键值观察(代码示例)
被观察的对象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运行时的,下面就来详细介绍一下原理:还是这张图:
KVO与Notification之间的区别:
notification是需要一个发送notification的对象,一般是notificationCenter,来通知观察者。
KVO是直接通知到观察对象,并且逻辑非常清晰,实现步骤简单。
标签:
原文地址:http://www.cnblogs.com/junhuawang/p/5802325.html