ios开发--KVO浅析
目标:监听NSMutableArray对象中增加了什么
代码如下:
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- self.dataArray = [NSMutableArray arrayWithObject:@"1"];
- [self addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
- }
- (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);
- }
- (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"];
- }
- (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
- );
- }
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)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);
- }
- (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];
- }
- (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;
- }
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;
}
如有问题,请留言共同探讨。
ios开发--KVO浅析的更多相关文章
- iOS开发-KVO的奥秘
转自:http://www.jianshu.com/p/742b4b248da9 序言 在iOS开发中,苹果提供了许多机制给我们进行回调.KVO(key-value-observing)是一种十分有趣 ...
- iOS开发——实用篇&KVO与KVC详解
KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC ...
- iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)
iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...
- iOS开发中KVC、KVO简介
在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...
- iOS开发frame, contentSize, contentOffset, contentInset 区别联系浅析
1. 概述 iOS开发中,必然会涉及到布局相关问题,frame,bounds,contenSize,contentOffset,contentInset这几个布局相关概念让许多初学者感到困惑.虽然初步 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- IOS开发基础知识--碎片42
1:报thread 1:exc_bad_access(code=1,address=0x70********) 闪退 这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象( ...
随机推荐
- 学习练习 java 不重复的三位偶数
编写一个Java程序,计算一下1,2,…,9这9个数字可以组成多少个互不相同的.无重复数字的三位偶数. package com.hanqi; //编写一个Java程序,计算一下1,2,…,9 //这9 ...
- mjrefresh源码分析
最近想自己写个下拉刷新的库,但是始终感觉无从下手,想想总是容易的.原理也很简单,真正要下手写的时候,呵呵.不得不说ios封装得很好,网上可以用的成熟的库也很多,也正是因为如此很多开发者也忽略了很多底层 ...
- 对于不是特别擅长Photoshop的人来说,熟悉和运用Photoshop工具提供的各类便捷的快捷键,是有帮助的。
应用程序菜单快捷键之文件 应用程序菜单快捷键之编辑 应用程序菜单快捷键之图像图层 应用程序菜单快捷键 应用程序菜单快捷键之视图 Ctrl + H 取消参考线 调板菜单 ...
- MVC组件分析(转)
2System.Web.Mvc V 4.0.0.0 组件分析 2.1 Routing组件(路由选择) Routing的作用就是负责分析Url Action的要求• 必须是一个公有方法• 必须返回Act ...
- hdu2099
注意是两位数,必须输出01,02,03,这种 #include <stdio.h> int main(){ int begin,end; int i; ]; int cnt; int si ...
- java初始化深度剖析
当用一个类来创建对象的时候,JVM会帮我们执行下面的6个步骤. 1.在磁盘上找到对应内的class文件: 2.加载class文件到内存,初始化所有静态域(成员变量和方法): 3.如果使用new cla ...
- C++ 必知必会: 条款1: 数据抽象
数据抽象, 具有C语言经理的我, 原先是将其看做是一个数据的集合, 把自己常用的数据通过某种方式总结,集合起来, 使用的时候能够更加方便------其实这个还是结构体思想的延续,结构体内部包含了若干的 ...
- 那么如何添加网站favicon.ico图标
1. 获得一个favicon.ico的图标,大小为16px×16px最为合适 2. 将制作好的图标文件Favicon.ico上传到网站的根目录: 3. 在首页文件的html代码的头部中加入如下代码: ...
- 深入PHP empty(),isset(),is_null()
PHP empty(),isset(),is_null()的实例测试. 有关 PHP编程 的 empty(),isset() 还有 is_null() 这三个函数的用法讨论得已经很多了,而且很多资 ...
- 纯js拖拽参考
function myDrag(obj){ obj.onmousedown=function(e){ var e=e||window.event; var diffX=e.clientX-this.o ...