@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的实现原理探寻的更多相关文章

  1. KVO内部实现原理

    KVO的原理: 只要给一个对象注册一个监听, 那么在运行时, 系统就会自动给该对象生成一个子类对象, (格式如:NSKVONotifying_className), 并且重写自动生成的子类对象的被监听 ...

  2. KVO底层实现原理,仿写KVO

    这篇文章简单介绍苹果的KVO底层是怎么实现的,自己仿照KVO的底层实现,写一个自己的KVO监听 #pragma mark--KVO底层实现 第一步:新建一个Person类继承NSObject Pers ...

  3. KVO 使用及原理

    KVO的基本原理大概是这样的   当一个对象被观察时, 系统会新建一个子类NSNotifying_A ,在子类中重写了对象被观察属性的 set方法,  并且改变了该对象的 isa 指针的指向(指向了新 ...

  4. KVC与KVO的实现原理

    |KVC的用法 1.KVC既键值编码(Key Value Coding),基于NSKeyValueCoding协议,它是以字符串的形式来操作对象的成员变量,也就是通过字符串key来指定要操作的成员变量 ...

  5. Andorid APK反逆向解决方案---梆梆加固原理探寻

    本文章由Jack_Jia编写,转载请注明出处.   文章链接:http://blog.csdn.net/jiazhijun/article/details/8892635 作者:Jack_Jia    ...

  6. IOS KVO的实现原理

    #import "HMViewController.h" #import "HMPerson.h" @interface HMViewController () ...

  7. KVC/KVO原理详解及编程指南

    一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...

  8. 【转】 KVC/KVO原理详解及编程指南

    原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...

  9. 转:KVC/KVO原理详解及编程指南

      作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...

随机推荐

  1. [Head First Python]4. pickle.dump pickle.load

    sketch.py #--*-- coding:utf-8 --*-- import pickle import nester man = [] other = [] try: data = open ...

  2. Python修改文件名

    Python批量修改文件名 # -*- coding: cp936 -*- import os from nt import chdir path="./files/" froms ...

  3. linux下安装pdf

    官方下载地址:http://www.foxitsoftware.cn/downloads/ 问题:下载官方包以后解压,双击不能打开,也没有任何提示. 用teminal 来打开foxitreader,t ...

  4. 常见的SQL字符串函数

    1.LEN:计算字符串的长度(字符的个数) select len('哈哈hello') 返回长度为7 2.datalength();计算字符串所占用的字节数,不属于字符串函数 select DATAL ...

  5. C++----练习--引用头文件

    1.创建头文件和源文件 touch /tmp/tools.h touch /tmp/main.cpp 2.各文件的内容如下: tools.h #include<iostream> void ...

  6. springMVC+ freemark多视图配置

    <!--通用视图解析器--> <bean id="viewResolverCommon" class="org.springframework.web. ...

  7. linux下类似Bus Hound的工具

    0推荐在linux大家有时候需要调试usb接口的串口消息,但是没有类似于windows下的bus hound工具,感觉比较痛苦,其实linux内核提供了usbmon这个工具,可以收集串口信息. 1.准 ...

  8. [置顶] SPL讲解(4)--Criteria操作篇

    概念 以前一篇文章中,描述了实体Entity的操作,很明显,仅仅实体的操作是远远不够的.如:我们经常会根据查询条件从数据库中获取记录集并绑定到DataGrid上,会根据条件进行批量的Update和De ...

  9. 产生n bit所有可能的序列

    void binary(int n) { ) printf("%s\n",A); // Assume A is a global variable else { A[n-] = ' ...

  10. Centos6.4在配置Tomcat7工作文件夹和虚拟路径

    写在前面:网上博文非常多复制粘贴.我试过很不可能.所以我写了下面的测试版本. 1.tomcat设备 非常easy只需要下载tomcat7 tar包裹 运行命令:tar -zxvf tomcat-7.5 ...