KVC键值编码:
(成员变量赋值)
因为是从字典中接收的值,不能直接使用原始数据类型和结构体:必须转换为NSNumber和NSValue类型
提供了一种在运行时而非编译时动态访问对象属性与实例变量的方式。即我们可以用字符串的内容作为属性名称或者实例变量名称进行访问。
setValue:forKey:方法以字符串的形式向对象发送消息,可以设置对象实例变量的值
valueForKey:方法以字符串的形式向对象发送消息,用于获取对象中实例变量中的值
键搜索顺序:
setValue:forKey:方法首先查找的时setKey命名的setter,如果不存在则在对象内部查找_key或key的实例变量
valueForKey:首先查找的时key或isKey命名的getter,如果不存在,则在对象内部查找_key或key的实例变量
键路径:键值编码支持指定键路径,访问键路径的方法是:setValue:forKeyPath:和valueForKeyPath:
符合KVC标准的存取方法:
赋值方法是set<Value>:,取值方法是<value>。<value>部分都必须替换成你要访问的属性名。属性名必须符合骆驼命名法。
常用集合运算符:
@count返回数组或者集合中元素的个数
@sum返回数组或者集合中元素的总和
@avg。。。平均值
@min。。。最小值
@max。。。最大值
KVO键值监听:
利用键值观察可以注册成为一个对象的观察者,在该对象的某个属性变化时收到通知。
编写键值观察分三步:
1、注册成为观察者 2、观察者定义KVO的回调 3、移除观察者;
完成后,键路径指定的属性的任何变化都可以自动调用观察者的回调方法。完成观察后,必须将观察者,如果观察者之后释放了,向被观察者发送通知时可能导致应用崩溃。
注册成为观察者:
-addObserver:forKeyPath:options:context:
例如[obj addObserver:self forKeyPath:@“kk” options:希望变化 context:nil];
第一个参数:常用self,接收通知的对象,即观察者。
第二个参数:键路径参数,要观察的键路径。
第三个参数:标识KVO希望变化如何传递给观察者,可通过 “ | ” 多选。
第四个参数:上下文内存区,通常为nil。
值 | 功能 |
NSKeyValueObservingOptionNew | 把更改之后的值提供给观察者的回调方法JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ |
NSKeyValueObservingOptionOld | 把更改之前的值提供给观察者的回调方法 |
NSKeyValueObservingOptionInitial | 把初始化的值提供给观察者的回调方法,一旦注册,立马就会调用依次。通常它会带有新值,而不会带有旧值。 |
NSKeyValueObservingOptionPrior | 在变更前后分别发送变更,而不止在变更后发送一次。分2次调用;在值改变之前和值改变之后。 |
定义KVO的回调:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@“想要观察键路径") {
NSString *newValue = [change objectForKey:NSKeyValueChangeNewKey];
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
keyPath是一个字符串,因此使用isEqualToString方法来确定该通知所对应的键路径。
实际的变化通过change参数传给你,该参数是一个NSDictionary对象,包含你注册成为观察者时所请求的变化信息相关的键和值。这些键和值如下表:
键 | 值 |
NSKeyValueChangeKindKey | 指定变化类型 |
NSKeyValueChangeNewKey | 新值 |
NSKeyValueChangeOldKey | 旧值 |
NSKeyValueChangeIndexesKey | 如果NSKeyValueChangeKindKey是 NSKeyValueChangeInsertion、NSKeyValueChangeRemoval、NSKeyValueChangeReplacement之一,该值就包含变化值的索引。 |
NSKeyValueChangeNotificationIsPriorKey | 和NSKeyValueChangeOptionPrior结合使用来表示这是“之前”的通知DDDDDDDDDDDDDDDDDDDDDDD |
NSKeyValueChangeKindKey指定了接收到的变化类型。可能类型如下:
值 | 功能 |
NSKeyValueChangeSetting | 指定该值被设置KKKKKKKKKKKKKKKKKKK |
NSKeyValueChangeInsertion | 指定这些值插入到集合或者一对多的关系中 |
NSKeyValueChangeRemoval | 指定这些值在一对多的关系中被移除 |
NSKeyValueChangeReplacement | 指定这些值在一对多的关系中被替换 |
移除观察者:
在观察者对象的dealloc方法中调用被观察者的removeObserve:forKeyPath:方法
-(void)dealloc{
[obj removeObserve:self forKeyPath:@“观察的键路径”];
[super dealloc];
}
obj为被观察对象。第一个参数为移除的观察者对象。第二个为观察的键路径。
通知:
通知是一种发送给一个或多个观察者,用来通知其在程序中发生了某个事件的消息。
1、通知中心NSNotificationCenter:
当一个对象发布一个通知,通知会先被发布到通知中心,程序中其他需要感知该事件的对象通过向通知中心注册就可以达到在事件发生时被通知中心及时通知到的目的。
通知中心是可以以同步的方式向其观察者发送通知,也可通过使用通知队列NSNotificationQueue异步发送通知。
2、系统通知:Cocoa框架定义好,只需在通知中心注册。
3、自定义通知:1、注册监听者 2、创建并发送通知 3、移除监听者
通知和KVO区别:
1、KVO只能监听属性的变化,通过NSString类型的属性名来实现。实现了自动监听,当属性值变化时,会自动通知观察者。 但观察者得持有被观察者的引用,以便被观察者注册观察者,耦合性高,不利于代码维护。
2、NSNotification比较灵活,可以监听的内容不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也灵活。但需要被观察者手动发送通知,观察者注册监听后才能进行响应,比KVO多了发送通知一步。但观察者注册监听不需要被观察者的引用,没有耦合性,利于代码的维护。