目标:监听NSMutableArray对象中增加了什么
代码如下:
- (void)viewDidLoad { [super viewDidLoad]; self.dataArray = [NSMutableArray arrayWithObject:@"1"]; [self addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL]; }
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"%@", keyPath); NSLog(@"%@", object); NSLog(@"%@", change); }
- (IBAction)add:(id)sender { NSArray *addData = [NSArray arrayWithObjects:@"11", @"12", @"13", nil]; [self.dataArray addObjectsFromArray:addData]; self.dataArray = [NSMutableArray arrayWithObject:@"2"]; }
输入日志:
2013-01-15 16:05:10.120 KVOTest[2199:907] dataArray 2013-01-15 16:05:10.121 KVOTest[2199:907] <ZZTViewController: 0x20846590> 2013-01-15 16:05:10.123 KVOTest[2199:907] { kind = 1; new = ( 2 ); old = ( 1, 11, 12, 13 ); }
经过测试得如下结论:kvo监听的是对象指针的变动,NSString、int、float等对象的变动(abc = @"123"、abc = 12、abc = 12.2)皆为指针的变动,所以通过此方式来捕捉array的变化是不可行的
但,我们可以通过此方式来做控件属性的变动。如下:
- (void)viewDidLoad { [super viewDidLoad]; self.personObject = [PersonObject personObjectWithBankInstance:[BankObject bankObjectWithAccountBalance:10]]; [self.personObject addObserver:self forKeyPath:@"bankInstance.accountBalance" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL]; // 此处注意是监听personObject对象下的bankInstance的accountBalance变化 }
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"%@", keyPath); NSLog(@"%@", object); NSLog(@"%@", change); }
- (IBAction)add:(id)sender { [self.personObject.bankInstance setAccountBalance:2111]; }
输出日志:
2013-01-15 16:05:10.111 KVOTest[2199:907] bankInstance.accountBalance 2013-01-15 16:05:10.116 KVOTest[2199:907] <PersonObject: 0x20856180> 2013-01-15 16:05:10.118 KVOTest[2199:907] { kind = 1; new = 2111; old = 10; }
如有问题,请留言共同探讨。
相关推荐
RxSwift函数式响应编程思想,RxSwift-KVO、Button、UITextField、ScrollView、手势、通知、定时器、网络请求的使用-Demo
用Runtime的方法简单的实现了一下KVO,通过这个Demo,能更方便对KVO的理解!Demo写的比较简单,有兴趣的同学可以加以完善或者可以把想法留言给我!github地址:https://github.com/Dreamskyqihang/HYKVODemo
如果需要观察多个属性的变化,为避免产生大量的代码,最好是使用键值观察(Key Value Observing,简称KVO),这也是Apple在自己的软件中大量使用的一种。 使用键值观察跟踪单个属性或集合(如数组)的变化非常...
iOS中KVC-KVO例子,
MVC KVO实现
iOS-KVO模式源码 KVODemo 适合初学者
KVC 与 KVO 使用姿势和原理解析
利用runtime简单的实现KVO底层原理,主要是提供了一个KVO的底层思路,和runtime的简单用法.仅供学习和交流使用
MVVM (降低耦合) KVO(一处计算总价钱) 键盘处理(精确到每个cell) 代码适配(手动代码适配,无第三方) ,还有全选,侧滑操作等操作,仅供大家参考交流 (需要安装pod 要下载图片啊 亲)
iOS开发·KVO用法,原理与底层实现: runtime模拟实现KVO监听机制(Blcok及Delgate方式).zip,iOS开发·KVO用法,原理与底层实现: runtime模拟实现KVO监听机制(Blcok及Delgate方式)
KVO_App iOS Objective-C中KVC和KVO的基本实现
一个简单的iOS分层开发采用Objective-C,基于MVCS和KVO
KVO全称是Key Value Observing,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于KVO的实现机制,只针对属性才会发生作用,一般继承自NSObject的对象都默认支持KVO...
里面功能不用kvo和枚举一样是可以实现的,甚至使用了kvo和枚举反而感觉多此一举, 这仅仅只是作为了解和学习参考,因为想不到啥简单的例子,所以搞一个脱裤子放屁的例子
一个KVO的简单例子
KVO-----当对象某个属性(例如 demo 中的字符串 name)发生更改时,对象会获得通知,并作出相应处理,本demo用Runtime实现KVO原理。
这是一个简单的纯 代码KVO 监控 属性
用于实现动态表单的 iOS Objective-C 库。 库提供了可定制的表单控制器(基于UITableViewController ),由于 KVO,它可以连接到表单数据模型对象。 表单字段由表格视图单元格表示。 开箱即用地定义了三种类型的...
iOS安全的KVO操作,解决由于添加了KVO忘记移除,或者多次移除导致的崩溃问题
加载网页的滚动KVO方式