- 浏览: 1031153 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (675)
- ios (214)
- android-course (5)
- unity3d (7)
- cocos2d (36)
- html5 (3)
- game (5)
- android (42)
- java (57)
- php (12)
- 创业 (10)
- SEO (3)
- 架构 (2)
- 数据库 (3)
- 产品设计 (9)
- 操作系统 (10)
- Web前端 (11)
- 其他 (50)
- GAE (1)
- mac os (8)
- Open Source (2)
- 序列号 (10)
- C (2)
- database (2)
- 算法 (6)
- 设计模式 (1)
- photoshop (1)
- 3dmax (1)
- maya (1)
- opengl (3)
- 游戏设计 (1)
- 趋势 (1)
- cocos2d-x (4)
- shell (3)
- c++ (30)
- lua (5)
- flash (1)
- spring (3)
- mysql (4)
- Git (6)
- xmpp (1)
- cocos2dx (14)
- mac (2)
- 编程规范 (2)
- windows (1)
- linux (5)
- coocs2dx (1)
- ubuntu (2)
- aws (1)
- OPENGLES (1)
- 原画 (1)
最新评论
-
jlees:
Best mobile app testing tool pc ...
iOS + XCode 4 + GHUnit = Mobile TDD+Continuous testing -
ipanda:
楼主,能否给一个Micro CloudFoundry的虚机或者 ...
Cloud Foundry使用及开发向导 -
love_zongming:
谢谢分享。。
visio2007序列号 -
雨花台舞水:
你这才是枪文把
套在 360 黑匣子外面的黑盒子:你被技术型枪稿吓到了么? -
hugh.wang:
改天试试
Mac版魔兽争霸3 1.24e下载
Objective-C里面的Key-Value Observing (KVO)机制,非常不错,可以很好的减少浇水代码。关于KVO的学习,可以参考文章:《Key-Value Observing快速入门》:http://www.cocoadev.cn/Objective-C/Key-Value-Observing-Quick-Start-cn.asp
Key-Value Coding(KVC)实现分析
KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位的。isa指针,如其名称所指,(就是is a kind of的意思),指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。
比如说如下的一行KVC的代码:
[site setValue:@"sitename" forKey:@"name"];
就会被编译器处理成:
SEL sel = sel_get_uid ("setValue:forKey:");
IMP method = objc_msg_lookup (site->isa,sel);
method(site, sel, @"sitename", @"name");
首先介绍两个基本概念:
(1)SEL数据类型:它是编译器运行Objective-C里的方法的环境参数。
(2)IMP数据类型:他其实就是一个 编译器内部实现时候的函数指针。当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型。
关于如何找到实现函数的指针,可参考文章:《Objective-C如何避免动态绑定,而获得方法地址》:http://www.cocoadev.cn/Objective-C/Get-method-address.asp
这下KVC内部的实现就很清楚的清楚了:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。
Key-Value Observing(KVO)实现
在上面所介绍的KVC机制上加上KVO的自动观察消息通知机制就水到渠成了。
当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。所以isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。
熟悉KVO的朋友都知道,只有当我们调用KVC去访问key值的时候KVO才会起作用。所以肯定确定的是,KVO是基于KVC实现的。其实看了上面我们的分析以后,关系KVO的架构的构思也就水到渠成了。
因为KVC的实现机制,可以很容易看到某个KVC操作的Key,而后也很容易的跟观察者注册表中的Key进行匹对。假如访问的Key是被观察的Key,那么我们在内部就可以很容易的到观察者注册表中去找到观察者对象,而后给他发送消息。
发表评论
-
Mac上安装Protocol Buffers
2016-09-18 11:29 8191.下载文件 (http://code.google.com ... -
webview点击获取图片
2016-04-01 17:12 827UILongPressGestureRecognizer * ... -
hexo 自动部署脚步
2016-03-29 21:17 932echo "===============star ... -
自定义navigationItem.leftBarButtonItem后,系统默认的手势滑动失效解决方案
2016-03-01 18:01 1280自定义navigationItem.le ... -
UITextView autolayout 高度自适应
2016-02-15 23:26 1413UITextView *t = [[UITextView ... -
腾讯敏捷框架TAPD》研究
2015-11-19 20:47 1420这篇文档是研究心得 ... -
ios image 压缩
2015-11-06 12:09 837- (UIImage *)_scaleToSize:(UII ... -
iphone分辨率图解
2015-11-04 17:33 565iphone分辨率图解 -
IOS中获取各种文件的目录路径的方法
2015-09-24 12:10 647iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储 ... -
Customizing Navigation Bar and Status Bar in iOS 7
2015-08-17 20:23 1606Like many of you, I have been ... -
GCD 深入理解:第一部分
2015-07-24 14:49 767本文翻译自 http://www.raywenderlich ... -
Mac上的抓包工具Charles
2015-05-06 01:09 5316Mac上的抓包工具Charles 分类: IO ... -
如何移除发布版本中的NSLog输出
2015-05-04 20:27 749Phone开发中会经常使用NSLog将一些运行信息输出到终端 ... -
xcode4的环境变量,Build Settings参数,workspace及联编设置
2015-03-27 11:23 925一、xcode4中的环境变量 $(BUILT_PROD ... -
数字签名是什么?
2014-11-25 16:58 616http://www.ruanyifeng.com/blog/ ... -
让你的Xcode更加高效
2014-10-29 00:16 518http://www.tairan.com/archives/ ... -
我所经历的“余额宝”的那些故事
2014-06-08 01:05 758“余额宝”经过不到 ... -
代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
2014-05-31 01:25 794最近接触了几个刚入门的iOS学习者,他们之中存在一个普遍 ... -
WWDC 2013 Session笔记 - iOS7中的多任务
2014-05-31 01:24 661这是我的WWDC2013系列笔记中的一篇,完整的笔记列表 ... -
APP被苹果App Store拒绝的79个原因(未完待续)
2014-05-09 10:49 1147作为iOS开发者,估计有很多都遇到过APP提交到App Sto ...
相关推荐
通过分析提供的代码,我们可以学习到如何在实践中应用这些概念,了解KVC和KVO的正确使用方式和潜在的陷阱。 在实际项目中,KVC和KVO结合使用可以创建出强大的数据驱动的应用。例如,模型对象可以通过KVC轻松地序列...
- 与KVO结合:KVC常用于触发KVO通知,实现属性的自动更新。 **KVC的局限性:** - 错误处理:如果键不存在或类型不匹配,KVC可能会抛出异常,因此需要做好错误处理。 - 性能:相比于直接访问属性,KVC操作通常较慢,...
总结来说,KVO和KVC是Objective-C中实现数据绑定和动态属性访问的重要技术,它们极大地提高了代码的灵活性和可维护性,尤其是在UI与数据模型间的交互中。理解并熟练运用这两种技术,对提升iOS开发技能有着重要作用。
**KVO(Key-Value Observing)与KVC(Key-Value Coding)是Objective-C中的两种重要编程概念,主要用于对象属性的监听与间接访问。在这个DEMO中,我们将深入探讨这两种技术的工作原理、应用场景以及如何在实践中使用...
**KVO(Key-ValueObserving)与KVC(Key-ValueCoding)是Objective-C中的两种重要特性,它们为Objective-C提供了数据绑定和属性访问的能力。在Mac开发中,这两种技术常常被用来实现数据模型与用户界面之间的动态交互...
在实现KVO时,Objective-C会自动调用KVC方法来检查和修改属性值。 ### 注意事项 1. 安全性:使用KVC时,如果键不存在,可能会导致程序崩溃,因此需要确保键的有效性。 2. 性能影响:频繁使用KVC和KVO可能对性能...
### iOS KVO KVC 编程 #### KVC与KVO简介 在iOS开发中,键值编码(Key-Value Coding, KVC)和键值观察(Key-Value Observing, KVO)是两个非常重要的概念,它们为Objective-C语言提供了一种灵活的方式来访问和修改...
Swift中的Key-Value Coding(KVC)和Key-Value Observing(KVO)是两种强大的数据绑定技术,它们允许程序员间接访问对象的属性并监听这些属性的变化。在本文中,我们将深入探讨这两种技术的使用方法、工作原理以及...
详细的介绍了KVO与KVC的原理机制,可以有效运用KVO-KVC编程
### KVC、kVO原理详解 #### 一、KVC(Key-Value Coding)与 KVO(Key-Value Observing)简介 KVC 和 KVO 是 Objective-C 中两个非常重要的特性,它们为开发者提供了强大的数据访问和观察机制。这两种技术在 Cocoa ...
**iOS KVC(Key-Value Coding)实现原理** Key-Value Coding(KVC)是Apple在Objective-C中引入的一种机制,它允许程序通过键值来访问对象的属性,而无需直接调用setter或getter方法。KVC在很多Apple的框架中都有...
**KVC (Key-Value Coding)** 是Objective-C中的一...通过分析和学习这个Demo,开发者可以更深入地理解KVC和KVO的工作原理,并在实际项目中有效地利用它们。这些技术对于创建响应式、灵活且易于维护的iOS应用至关重要。
**iOS KVO底层实现——基于...在提供的压缩包文件"KVO模拟"中,可能包含了一个简单的KVO实现示例,通过运行和分析代码,你可以更直观地理解上述概念。通过实践,加深对KVO和Runtime的理解,进一步提升iOS开发技能。
**iOS KVO(Key-Value Observing)实现原理** Key-Value Observing,简称KVO,是Objective-C中的一种机制,允许对象监听其他对象的属性变化。KVO是Apple为Foundation框架提供的一种强大的数据绑定技术,它使得一个...
KVC和KVO的结合使用,可以在iOS应用中实现灵活的数据绑定和动态数据更新,尤其在MVVM(Model-View-ViewModel)架构中,它们发挥着关键作用。KVC简化了对象属性的访问,而KVO则提供了实时数据变动的响应机制,两者...
4. **非KVC兼容性**:不是所有的属性都支持KVO,只有遵循KVC(Key-ValueCoding)协议的属性才能被观察。 **示例代码**: ```objc // 添加观察者 [myModel addObserver:self forKeyPath:@"myProperty" options:...
然而,需要注意的是,虽然KVO和KVC提供了便利,但也可能引入性能开销和潜在的错误,因此在设计和实现时应谨慎使用。 在实际项目中,KVO常用于视图模型与视图的数据绑定,而KVC则在Core Data、NSPredicate以及进行...
Swift本身并不直接支持KVO和KVC,但可以通过桥接头文件使用Objective-C的库来实现这些功能。本篇文章将深入探讨如何在Swift中利用objc库来实现KVO和KVC。 首先,理解KVO和KVC的基本概念: 1. KVO(Key-Value ...
在KVC_KVO_Test这个项目中,开发者可能创建了一个示例应用,演示了如何使用KVC和KVO进行属性的读取、设置以及监听属性变化。通过查看源代码,你可以学习如何在实际场景中应用这些概念,例如在用户界面更新、模型和...
KVC和KVO经常一起使用,因为KVO的底层实现依赖于KVC。当调用`addObserver:forKeyPath:options:context:`时,系统会尝试使用KVC来获取和设置属性的值,从而触发KVO的通知。 ### 注意事项 1. **属性要求**:为了使...