键-值编码 KVC
-
setValue:forKey:
通过名称(字符串)设置任何属性的值,字符串可在运行时修改[aObject setValue:theValue forKey:theKey]
-
valueForKey:
从对象中获取属性的值NSString *aString = [aObject valueForKey:theKey]
- 其实与
getter
,setter
一样,但更加灵活
键-值观察 Key-Value Observing, KVO
- 控制器获知何时更新视图
- 反复检查模型观察是否有任何更改
- 创建计时器,定期从模型中获取最新值,并提供给视图
- 浪费资源:时间,CPU,电池
- 等待模型向控制器通知变化
- 反复检查模型观察是否有任何更改
- 允许对象注册为 当另一个对象 更改它的一个属性的值时收到通知
- 注册更改通知
-
告诉对象要观察的三件事
- 当属性修改时,需要被通知的对象(观察者)
- 被观察者的属性名称
- 当一个变化发生时,观察者应该被告知的信息
- [optional]包含一个指针或引用,当属性值发生变化时,指针或对象引用应该被传递到运行的方法中
-
注册通知
[aProduct addObserver:self forKeyPath:@"productName" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];
-
当一个对象被注册为另一个对象的一个观察者时,该对象(如:观察者)将接收
observeValueForKeyPath:ofObject:change:context:
消息- 属性发生变化的对象
- 发生变化的属性对象
- 一个包含变化信息的
NSDictionary
- 当此消息被调用时,
context
变量将传递进去
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"productName"]) { NSString *newName = [change objectForKey:NSKeyValueChangeNew]; ... //通知响相应视图根据newName变量的值进行更新 } }
-
NSDictionary
包含不同的信息和其他键 -
NSKeyValueObservingOptionNew
属性要被设置的值 -
NSKeyValueObservingOptionOld
属性之前的值
-
将变化通知给观察者
使用了
Objective-C
的属性@property
,当setter
被调用时,Cocoa自动通知任何已注册的观察者-
不使用属性,或重写了
setter
,需要手动通知系统- 对
self
对象调用willChangeValueForKey
与didChangeValueForKey
,跟踪新值,旧值 - 重写
setter
,同时允许KVO工作
- (void) setProductName:(NSString *)newProductName { [self willchangeValueForKey:@"productName"]; productName = newProductName; [self didChangeValueForKey:@"productName"]; }
- 对
-
使用NSNotification
进行通知
- 某些相关联的事情发生,使用广播通知
- 按下Home键
-
NSNotification
对注册对象发送广播通知,由NSNotificationCenter
管理,是单例对象 - 相应Home键按下
-
注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnteredBackground:) UIApplicationDidEnterBackgroundNotification object:nil];
-
当
UIApplicationDidEnterBackgroundNotification
传递出去,注册的对象将运行applicationenteredBackground:
方法,此方法定义在该对象所属类中- (void)applicationEnteredBackground:(NSNotification *)notification { //进入后台,进行处理 }
[[NSNotificationCenter defaultCenter] removeObserver:self]- 不希望接收到消息
-