博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios开发--KVO浅析
阅读量:6828 次
发布时间:2019-06-26

本文共 3833 字,大约阅读时间需要 12 分钟。

 

目标:监听NSMutableArray对象中增加了什么

 

代码如下:

C代码  
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.   
  5.     self.dataArray = [NSMutableArray arrayWithObject:@"1"];  
  6.     [self addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];  
  7.        
  8. }  
- (void)viewDidLoad{    [super viewDidLoad];    self.dataArray = [NSMutableArray arrayWithObject:@"1"];    [self addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];     }

 

C代码  
  1. - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  
  2. {  
  3.     NSLog(@"%@", keyPath);  
  4.     NSLog(@"%@", object);  
  5.     NSLog(@"%@", change);  
  6. }  
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    NSLog(@"%@", keyPath);    NSLog(@"%@", object);    NSLog(@"%@", change);}

 

C代码  
  1. - (IBAction)add:(id)sender  
  2. {  
  3.     NSArray *addData = [NSArray arrayWithObjects:@"11", @"12", @"13", nil];  
  4.     [self.dataArray addObjectsFromArray:addData];  
  5.       
  6.     self.dataArray = [NSMutableArray arrayWithObject:@"2"];  
  7. }  
- (IBAction)add:(id)sender{    NSArray *addData = [NSArray arrayWithObjects:@"11", @"12", @"13", nil];    [self.dataArray addObjectsFromArray:addData];        self.dataArray = [NSMutableArray arrayWithObject:@"2"];}

 

输入日志:

C代码  
  1. 2013-01-15 16:05:10.120 KVOTest[2199:907] dataArray  
  2. 2013-01-15 16:05:10.121 KVOTest[2199:907] <ZZTViewController: 0x20846590>  
  3. 2013-01-15 16:05:10.123 KVOTest[2199:907] {  
  4.     kind = 1;  
  5.     new =     (  
  6.         2  
  7.     );  
  8.     old =     (  
  9.         1,  
  10.         11,  
  11.         12,  
  12.         13  
  13.     );  
  14. }  
2013-01-15 16:05:10.120 KVOTest[2199:907] dataArray2013-01-15 16:05:10.121 KVOTest[2199:907] 
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的变化是不可行的

 

但,我们可以通过此方式来做控件属性的变动。如下:

C代码  
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.       
  5.     self.personObject = [PersonObject personObjectWithBankInstance:[BankObject bankObjectWithAccountBalance:10]];  
  6.       
  7.     [self.personObject addObserver:self forKeyPath:@"bankInstance.accountBalance" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];    // 此处注意是监听personObject对象下的bankInstance的accountBalance变化  
  8. }  
- (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变化}

 

C代码  
  1. - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  
  2. {  
  3.     NSLog(@"%@", keyPath);  
  4.     NSLog(@"%@", object);  
  5.     NSLog(@"%@", change);  
  6. }  
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    NSLog(@"%@", keyPath);    NSLog(@"%@", object);    NSLog(@"%@", change);}

 

C代码  
  1. - (IBAction)add:(id)sender  
  2. {  
  3.     [self.personObject.bankInstance setAccountBalance:2111];  
  4. }  
- (IBAction)add:(id)sender{    [self.personObject.bankInstance setAccountBalance:2111];}

 输出日志:

C代码  
  1. 2013-01-15 16:05:10.111 KVOTest[2199:907] bankInstance.accountBalance  
  2. 2013-01-15 16:05:10.116 KVOTest[2199:907] <PersonObject: 0x20856180>  
  3. 2013-01-15 16:05:10.118 KVOTest[2199:907] {  
  4.     kind = 1;  
  5.     new = 2111;  
  6.     old = 10;  
  7. }  
2013-01-15 16:05:10.111 KVOTest[2199:907] bankInstance.accountBalance2013-01-15 16:05:10.116 KVOTest[2199:907] 
2013-01-15 16:05:10.118 KVOTest[2199:907] { kind = 1; new = 2111; old = 10;}

 

如有问题,请留言共同探讨。

转载于:https://www.cnblogs.com/lovewx/p/4210737.html

你可能感兴趣的文章
2013互联网公司,年终奖有几何?
查看>>
互联网
查看>>
MySQL load data 权限相关
查看>>
ScriptManager.RegisterStartupScript失效的解决方案
查看>>
vsftpd 添加用户
查看>>
递归方法
查看>>
Sonar+maven+jenkins集成,Java代码走查
查看>>
js中点击返回顶部
查看>>
Gtest源码剖析:1.实现一个超级简单的测试框架xtest
查看>>
第三方模块的安装
查看>>
Terracotta中锁与性能的问题
查看>>
遇到Linux系统安装时窗口过大,按钮点不到,该怎么解决
查看>>
js 判断输入是否为正整数
查看>>
「收藏」一些有趣的图
查看>>
探索虚函数(二)
查看>>
李青云老人的长寿秘诀【转】
查看>>
Springboot Thymeleaf 发邮件 将html内容展示在邮件内容中
查看>>
BZOJ2434:[NOI2011]阿狸的打字机——题解
查看>>
第5件事 做一个有taste的产品人
查看>>
暂时记录
查看>>