12、iOS 开发之 KVC \KVO

本文介绍了Objective-C中的键值对编码(KVC)和键值对观察(KVO)技术。KVC提供了通过字符串来访问对象属性的方法,包括valueForKey:和setValue:ForKey:等;KVO则用于监听对象属性变化,通过 addObserver:forKeyPath:实现。

一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值