一、KVC:键值对编码
1、常用的方法
valueForKey:
setValue:ForKey:
以字符串的形式向对象发送消息
2.程序实例
@interface Card : NSObject
@property (copy,nonatomic) NSString* no;
@end
@interface Student : NSObject
@property (assign,nonatomic) int age;
@property (copy,nonatomic) NSString* name;
@property (retain,nonatomic) Card* card;
@end
1> valueForKey:
NSString *name = [student valueForKey:@"name"];
* valueForKey:首先查找name或isName命名的get方法,如果不存在get方法就是在对象内部找名为_name或name的实例变量
* 使用valueForKey:时,KVC会自动将标量值(int float struct)包装成NSNumber,NSValue
2> setValue:ForKey:
[student setValue:@"MJ" ForKey:@"name"];
* setValue:ForKey:首先查找setter方法,setName:如果不存在setter方法,就在类中查找名为name或_name的实例变量,然后为它赋值
* 批处理:setValueForKeysWithDictionary:
3> 键路径 setValue:ForKeyPath:
[student setValue:@"12345" ForKeyPath:@"card.no"];
获取student对象中的Card对象的no
[student valueForKeyPath:@"card.no"];
3.数组的整体操作
@interface Book : NSObject
@property (copy,nonatomic) NSString* name;
@property (assign,nonatomic) float price;
@end
@interface student : NSObject
@property (retain,nonatomic) NSArray* books;
@end
获取Student中所有Book的name
NSArray *names = [student.books valueForKeyPath:@”name”];
NSArray *names = [student valueForKeyPath:@”books.name”];
*注意:不能在键路径中为数组添加索引,比如@”books[0].name”
二、KVO
- 监听对象属性的变化
1.注册监听器:
-(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
// anObserver:监听器对象
// keyPath:监听的属性
// options:决定了当前属性改变时,要传递什么数据给监听器
2.监听器需要实现的方法
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
// keyPath :监听的属性
// object :谁的属性改变了
// change :属性改变时传递过来的信息(取决于添加监听器时的options参数)
3.移除监听器
-(void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath
本文介绍了Objective-C中的键值对编码(KVC)和键值对观察(KVO)技术。KVC提供了通过字符串来访问对象属性的方法,包括valueForKey:和setValue:ForKey:等;KVO则用于监听对象属性变化,通过 addObserver:forKeyPath:实现。

1892

被折叠的 条评论
为什么被折叠?



