KVO的实现原理探寻
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
一讲到KVO好像很神奇很厉害的样子,那究竟是什么原理呢
首先,我们先来见一个最简单的KVO
新建一个Person类,就一行代码
@property (nonatomic, assign) int age;
然后在viewController中调用一下
- (void)viewDidLoad {
[super viewDidLoad];
_p = [[Person alloc] init];
_p.age = 10;
[_p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
_p.age = 20;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@对象的%@属性改变:%@", object, keyPath, change);
}
- (void)dealloc
{
[_p removeObserver:self forKeyPath:@"age"];
}
输出结果:
<Person: 0x7f7fcb6678e0>对象的age属性改变:{
kind = 1;
new = 20;
old = 10;
}
下面进入正题,我们打两个断点调试一下
第一个断点给age赋值的时候,P的isa指针指向的是Preson,说明是Person类
当增加完监听以后,神奇的事情发生了,P的isa指针指向了NSKVONotifying_Person,显然我们是没有创建过这个类的,
那一定是自动创建的了
然后我们打印一下setAge地址看看:
NSLog(@"%p",method_getImplementation(class_getInstanceMethod(objc_getClass("Person"), @selector(setAge:))));
NSLog(@"%p",method_getDescription(class_getInstanceMethod(objc_getClass("NSKVONotifying_Person"), @selector(setAge:))));
输出结果 ;
0x103ffb9a0
0x7fddaa69fe58
总结:过多的就不探寻了,推测应该是系统自动创建了一个 NSKVONotifying_Person 类继承自 Person,并重写了set方法,这样就能够知道什么时候键值发生了改变
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
KVO的实现原理探寻的更多相关文章
- KVO内部实现原理
KVO的原理: 只要给一个对象注册一个监听, 那么在运行时, 系统就会自动给该对象生成一个子类对象, (格式如:NSKVONotifying_className), 并且重写自动生成的子类对象的被监听 ...
- KVO底层实现原理,仿写KVO
这篇文章简单介绍苹果的KVO底层是怎么实现的,自己仿照KVO的底层实现,写一个自己的KVO监听 #pragma mark--KVO底层实现 第一步:新建一个Person类继承NSObject Pers ...
- KVO 使用及原理
KVO的基本原理大概是这样的 当一个对象被观察时, 系统会新建一个子类NSNotifying_A ,在子类中重写了对象被观察属性的 set方法, 并且改变了该对象的 isa 指针的指向(指向了新 ...
- KVC与KVO的实现原理
|KVC的用法 1.KVC既键值编码(Key Value Coding),基于NSKeyValueCoding协议,它是以字符串的形式来操作对象的成员变量,也就是通过字符串key来指定要操作的成员变量 ...
- Andorid APK反逆向解决方案---梆梆加固原理探寻
本文章由Jack_Jia编写,转载请注明出处. 文章链接:http://blog.csdn.net/jiazhijun/article/details/8892635 作者:Jack_Jia ...
- IOS KVO的实现原理
#import "HMViewController.h" #import "HMPerson.h" @interface HMViewController () ...
- KVC/KVO原理详解及编程指南
一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...
- 【转】 KVC/KVO原理详解及编程指南
原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...
- 转:KVC/KVO原理详解及编程指南
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...
随机推荐
- [Head First Python]4. pickle.dump pickle.load
sketch.py #--*-- coding:utf-8 --*-- import pickle import nester man = [] other = [] try: data = open ...
- Python修改文件名
Python批量修改文件名 # -*- coding: cp936 -*- import os from nt import chdir path="./files/" froms ...
- linux下安装pdf
官方下载地址:http://www.foxitsoftware.cn/downloads/ 问题:下载官方包以后解压,双击不能打开,也没有任何提示. 用teminal 来打开foxitreader,t ...
- 常见的SQL字符串函数
1.LEN:计算字符串的长度(字符的个数) select len('哈哈hello') 返回长度为7 2.datalength();计算字符串所占用的字节数,不属于字符串函数 select DATAL ...
- C++----练习--引用头文件
1.创建头文件和源文件 touch /tmp/tools.h touch /tmp/main.cpp 2.各文件的内容如下: tools.h #include<iostream> void ...
- springMVC+ freemark多视图配置
<!--通用视图解析器--> <bean id="viewResolverCommon" class="org.springframework.web. ...
- linux下类似Bus Hound的工具
0推荐在linux大家有时候需要调试usb接口的串口消息,但是没有类似于windows下的bus hound工具,感觉比较痛苦,其实linux内核提供了usbmon这个工具,可以收集串口信息. 1.准 ...
- [置顶] SPL讲解(4)--Criteria操作篇
概念 以前一篇文章中,描述了实体Entity的操作,很明显,仅仅实体的操作是远远不够的.如:我们经常会根据查询条件从数据库中获取记录集并绑定到DataGrid上,会根据条件进行批量的Update和De ...
- 产生n bit所有可能的序列
void binary(int n) { ) printf("%s\n",A); // Assume A is a global variable else { A[n-] = ' ...
- Centos6.4在配置Tomcat7工作文件夹和虚拟路径
写在前面:网上博文非常多复制粘贴.我试过很不可能.所以我写了下面的测试版本. 1.tomcat设备 非常easy只需要下载tomcat7 tar包裹 运行命令:tar -zxvf tomcat-7.5 ...