@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);

最新文章

  1. Jquery(1)
  2. Android 拍照后保证保证图片不失真,进行压缩
  3. oracle 用户创建这个挺靠谱
  4. [Xamarin] 使用LayoutInflater.Inflate載入預先設計好的Layout並使用 (转帖)
  5. Eclipse无法启动报An internal error occurred during: &quot;reload maven project&quot;. java.lang.NullPointerException
  6. 华硕X84L无线驱动查找
  7. CCF真题Z型输出
  8. 【转】MYISAM表批量压缩
  9. CSS/块级元素与内联元素的深入理解
  10. sqlserver merge into
  11. .进程&amp;线程(&amp;java.lang.Thread)详解
  12. centos 7(Linux) 下yum安装mysql
  13. SQL语句异常导致项目报错
  14. JDK安装与环境配置——学习JAVA的准备工作
  15. Linux 关闭网络管理服务
  16. 腾讯云服务器 离线安装最新稳定版MariaDB 10.2.6
  17. 20170801xlVBA含有公式出现弹窗合并
  18. scrapy 直接在编辑器运行
  19. DataGridView、List&lt;T&gt;相关操作
  20. 用最简单的例子理解策略模式(Strategy Pattern)

热门文章

  1. Array类型(一)
  2. Oracle数据库之间数据同步
  3. InetAddress类的使用
  4. 查文件大小列表 MySQL问题
  5. TFS2013团队使用纪要
  6. Primo Ramdisk配置教程
  7. 动态创建和移除HTML标签
  8. Eight(South Central USA 1998)(八数码) 分类: bfs 2015-07-05 22:34 1人阅读 评论(0) 收藏
  9. nc命令 (NetCat)
  10. PHP MySQL 创建数据库和表 之 Create