代理:一般控件用的比较多,其实也可以用block实现,如果实现的接口比较多的话,建议用代理,如UITableview。
通知:是全局的,而且是同步的,如果你要全局发送消息,并且做的事情时间不长,不会阻塞线程的话,建议使用。
KVO(Key-Value Observing):它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
KVO是建立在KVC的基础之上的,它通过 key path 观察对象的值,当值发生变化的时候会收到通知。比如,你需要监听UITableview的contentoffset那么当,tableview滑动的时候,就会不停的收到contentoffset point值。你要监听某一对象的值的时候,建议使用。
使用方法:
- 注册,指定被观察者的属性
- 实现回调方法
- 移除观察
stockForKVO = [[StockData alloc] init];
[stockForKVO setValue:@"searph" forKey:@"stockName"];
[stockForKVO setValue:@"10.0" forKey:@"price"];
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
实现回调方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"price"])
{
myLabel.text = [stockForKVO valueForKey:@"price"];
}
}
在最后的时候,移除观察者
- (void)dealloc
{
[stockForKVO removeObserver:self forKeyPath:@"price"];
}
KVC(Key Value Coding):除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。
Student *student = [[[Student alloc]init ]autorelease];
[student setValue:@"张三" forKey:@"name"];
NSString *name = [student valueForKey:@"name"];
NSLog(@"学生姓名:%@",name);