KVO (Key Value Observing)
Kvo是Cocoa的一个重要机制,当指定的对象的属性被修改后,则观察者就会接收到对象有变动通知。
-(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void*型)
[self.view addObserver:selfforKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if([keyPath isEqualToString:@"self.frame"]) {
label.text = model.value;
......
}
}
3 注销
- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath
在使用ARC时注销的时机仍然可以使用-dealloc事件,只是不需要调用
[super dealloc];
原文见:http://stackoverflow.com/questions/6959896/kvo-and-arc-how-to-removeobserver
KVC (Key Value Coding) 文档有很多这里不写了
KVO的原理:
首先参考http://blog.csdn.net/iunion/article/details/46889641介绍Objective-C类和元类的文章
- NSLog(@"self->isa:%@",self->isa);
- NSLog(@"self class:%@",[self class]);
- self->isa:Person
- self class:Person
- self->isa:NSKVONotifying_Person
- self class:Person
- - (void)willChangeValueForKey:(NSString *)key
- - (void)didChangeValueForKey:(NSString *)key
- - (void)observeValueForKeyPath:(NSString *)keyPath
- ofObject:(id)object
- change:(NSDictionary *)change
- context:(void *)context
- - (void)willChangeValueForKey:(NSString *)key
- - (void)didChangeValueForKey:(NSString *)key
- (void)setFreshHeaderView:(RefreshTableHeaderView *)headerView
{
if (headerView != self.freshHeaderView)
{
if (self.freshHeaderView.superview)
{
[self.freshHeaderView removeFromSuperview];
}
[self addSubview:headerView];
// KVO
[self willChangeValueForKey:@"freshHeaderView"];
objc_setAssociatedObject(self, &FRESH_HEADER_VIEW_KEY, headerView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self didChangeValueForKey:@"freshHeaderView"];
}
}