ios开发--KVO浅析

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

代码如下:

C代码  

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. self.dataArray = [NSMutableArray arrayWithObject:@"1"];
  5. [self addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
  6. }
- (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. self.dataArray = [NSMutableArray arrayWithObject:@"2"];
  6. }
- (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] 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的变化是不可行的

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

C代码  

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

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

时间: 2024-11-05 16:00:34

ios开发--KVO浅析的相关文章

iOS开发-KVO的奥秘

iOS开发-KVO的奥秘 字数2933 阅读3842 评论28 喜欢57 序言 在iOS开发中,苹果提供了许多机制给我们进行回调.KVO(key-value-observing)是一种十分有趣的回调机制,在某个对象注册监听者后,在被监听的对象发生改变时,对象会发送一个通知给监听者,以便监听者执行回调操作.最常见的KVO运用是监听scrollView的contentOffset属性,来完成用户滚动时动态改变某些控件的属性实现效果,包括渐变导航栏.下拉刷新控件等效果. 渐变导航栏 使用 KVO的使用

iOS开发——KVO/KVC&amp;OC与Swift篇详解

Swift中使用KVC和KVO的类都必须必须继承自NSObject KVC key-value coding 是1种间接访问对象的机制 key的值就是属性名称的字符串,返回的value是任意类型,需要自己转化为需要的类型 KVC主要就是两个方法 (1)通过key设置对应的属性 (2)通过key获得对应的属性 举例 class TestForKVC:NSObject{ var hwcCSDN = "hello world" } var instance = TestForKVC() va

iOS开发——实用篇&amp;KVO与KVC详解

KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听(KVO)特性: 键值编码KVC 键值监听KVO 键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Valu

iOS开发中KVC、KVO简介

在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 Key Value Coding(键值编码),是OC 语言的一个特性,使用KVC,可以对对象的属性进行动态读写. KVC的操作方法由 NSKeyValueCoding协议提供,而NSObject已经实现了这个协议,因此OC中的几乎所有对象都可以使用KVC操作.常用的KVC操作方法有: (1)设置属性

ios开发 网络编程浅析(一)

iphone包含了很多框架和库,从底层的套接字到不同层次的封装,可以方便地给程序添加网络功能. (1)BSD套接字.最底层的套接字,这是Unix网络开发常用的API.如果从其他系统移植程序,而程序用的是BSD套接字,那么网络部分可以继续使用这些API. (2)CFNetwork framework .CFNetwork 也是比较底层的, 是对BSD套接字的一个扩展 .它是一个C语言的库,它是基于BSD套接字,提供了对网络协议的抽象.这些抽象使得用户更容易地操作套接字.处理网络的各种连接..它集成

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考<iOS多线程开发--NSOperation/NSOperationQueue浅析><iOS多线程开发--GCD的使用与多线程开发浅析>.以及对于多线程中的同步异步,并行串行等概念,我在<GCD实践--串行队列/并发队列与iOS多线程详解>中也有较为详细的讲解.为了学习的完整性,今天我们主要从代码层面来实现

ios开发——实用技术篇&amp;Block/KVO/通知/代理

Block/KVO/通知/代理简单介绍与使用 关于iOS开发中数据传递的方法有很多种,但是使用最多的就是这里的四种,而且我们要学会在适当的时候使用合适的方式,才能充分的提高app的性能 下面简单介绍一下这些方法的使用 Block 第一.综述 block是OC中另外一种对象和对象的通信方式,是一对一的关系,类似于delegate,而通知时一对多的关系 第二.定义block类型 int (^myBlock)(int) 第三.block的声明 mylock=^(int a) { int result

iOS开发——OC篇&amp;消息传递机制(KVO/NOtification/Block/代理/Target-Action)

iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Foundation Framework的,不过本文中还介绍了一些超出Foundation Framework(KVO和Notification)范围的一些消息传递机制,另外还介绍了delegation,block和target- action. 大多数情况下,消息传递该使用什么机制,是很明确的了,当然了,在某

iOS开发-由谈KVC、KVO(重点观察者模式)机制编程

一 不小心,小明在<跟着贝尔去冒险>这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文 化外,还是镜头少普通话跟小明一样烂的Laughing Sir那种冷静和沉着稳定留下了深刻印象,不由想起电视剧<学警狙击>中为了不暴露钟立文的身份,要求向自己补一枪的警匪卧底巅峰推动者 --Laughing 哥.那么,卧底这样的工作,在我们程序里有没有呢?答案是肯定的,观察者模式. 文章内容思维导图 一.基本概念 1)KVC概念 KVC