OC语言_08KVC/KVO/谓词
- key:键,用于标识实例变量
- value:实例变量对应的值
- 修改值:
setValue:forKey:setValue:forKeyPath:setValue:forUndefinedKey:setValueForKeysWithDictionary:
- 获取值:
valueForKey:valueForKeyPath:valueForUndefinedKey:
- 注意事项:
- 当key不存在的时候,会执行setValue:forUndefinedKey:
- 系统默认实现是抛出一个异常(可以用重写方法避免
key-value-coding
- 是一个用于间接访问对象属性的机制。
- 使用该机制不需要调用存取方法和变量实例就可以访问对象属性
- 键-值编码方法在Objective-C非正式协议(类目)NSKeyValueCoding中被声明。
- 默认的实现方法由NSObject提供。
- 键-值编码支持带有对象值的属性,同时也支持纯数值类型和结构。
- 非对象参数和返回类型会被识别并自动封装/解封
KVC基本使用方法:
设置和访问:基本包括-valueForKey: 和- setValue:forKey:这两个方法。
它们以字符串的形式向对象发送消息,字符串是我们关注属性的关键
1 Book *book = [[Book new] autorelease];
2 NSMutableString *name = [[NSMutableString alloc] initWithFormat:@“Jack”];
3 [book setValue:name forKey:@“name”];
4 NSLog(@“jack name: %@”,[book valueForKey:@“name”]);
5 }
- 是否存在setter、getter方法,优先调用访问器。
- 如果不存在,他将在内部查找名为_key或key的实例变量。
- 通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。
- 当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象的值时,如若对象的实例变量为基本数据类型时(char、int、float、BOOL),我们需要对数据进行封装
路径与一对多的关系
路径:除了通过键设置值外,键/值编码还支持制定路径,像系统文件一样。用“点号”隔开
1 [book setValue:@"Bill" forKey:@"author._name"];//不是点语法,是一个路径,下划线可以不加
2 [book valueForKeyPath:@"relativeBooks.price"];}
一对多的关系
如果向NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你。
1 NSArray *booksArray = [NSArray arrayWithObjects:book1, book2, nil];
2 [book setValue:booksArray forKey:@"relativeBooks"];
3 NSLog(@"books2:%@", [book valueForKeyPath:@"relativeBooks.price"]);
KVO的基本概念
基本概念:KVObserve,键值观察是一种使对象获得其他对象的特定属性变化的通知机制。
- 控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的。对于不依赖控制器层类的应用程序,键值观察提供了一种简化的方法来实现检查器并更新用户界面值。
- 与NSNotification不同,键值观察中并没有所谓的中心对象来为所有观察者提供变化通知。取而代之,当有变化时,通知被直接发送至处于观察状态的对象。NSObject提供这种基础的键值观察实现方法,你几乎不用重写该方法。
- 你可以观察任意对象属性,包括简单属性,对一或是对多关系。对多关系的观察者将会被告知发生变化的类型-也就是任意发生变化的对象。
- 键值观察为所有对象提供自动观察兼容性。你可以通过禁用自动观察通知并实现手动通知来筛选通知。
注册观察者:为了正确接受属性的变更通知,观察者对象必须首先发送一个。
- addObserver:forKeyPath:options:context:消息至被观察对象,用以传送观察对象和需要观察属性的关键路径,以便与其注册。选项参数指定了发送变更通知时提供给观察者的信息。使用NSKeyValueObservingOptionOld选项可以将初始对象值以变更字典中的一个项的形式提供给观察者。指定 NSKeyValueObservingOptionNew选项可以将新的值以一个项的形式添加至变更字典。你可以使用逐位“|”这两个常量来指定接收上述两种类型的值。
1 [child addObserver:self forKeyPath:@"tired" options:NSKeyValueObservingOptionOld|NSKeyValueOptionNew context:nil];//监听的@"tired"属性.//option属性发生变化时,旧和新的值都将传给监听者。
移除观察者身份:发送一条指定观察方对象和键路径的removeObserver:forKeyPath:消息至被观察者的对象
1 [child removeObserver:self forKeyPath:@"key"];
实例


浙公网安备 33010602011771号