12、iOS 开发之 KVC \KVO

来源:互联网 发布:免费网吧代理软件 编辑:程序博客网 时间:2024/05/21 12:47

一、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)objectchange:(NSDictionary *)change context:(void *)context
// keyPath :监听的属性// object :谁的属性改变了// change :属性改变时传递过来的信息(取决于添加监听器时的options参数)

3.移除监听器

-(void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath
0 0
原创粉丝点击