KVO的内部实现以及使用
转载自:http://www.cocoachina.com/applenews/devnews/2014/0107/7667.html
- // gcc -o kvoexplorer -framework Foundation kvoexplorer.m
- #import <Foundation/Foundation.h>
- #import <objc/runtime.h>
- @interface TestClass : NSObject
- {
- int x;
- int y;
- int z;
- }
- @property int x;
- @property int y;
- @property int z;
- @end
- @implementation TestClass
- @synthesize x, y, z;
- @end
- static NSArray *ClassMethodNames(Class c)
- {
- NSMutableArray *array = [NSMutableArray array];
- unsigned int methodCount = 0;
- Method *methodList = class_copyMethodList(c, &methodCount);
- unsigned int i;
- for(i = 0; i < methodCount; i++)
- [array addObject: NSStringFromSelector(method_getName(methodList[i]))];
- free(methodList);
- return array;
- }
- static void PrintDescription(NSString *name, id obj)
- {
- NSString *str = [NSString stringWithFormat:
- @"%@: %@\n\tNSObject class %s\n\tlibobjc class %s\n\timplements methods <%@>",
- name,
- obj,
- class_getName([obj class]),
- class_getName(obj->isa),
- [ClassMethodNames(obj->isa) componentsJoinedByString:@", "]];
- printf("%s\n", [str UTF8String]);
- }
- int main(int argc, char **argv)
- {
- [NSAutoreleasePool new];
- TestClass *x = [[TestClass alloc] init];
- TestClass *y = [[TestClass alloc] init];
- TestClass *xy = [[TestClass alloc] init];
- TestClass *control = [[TestClass alloc] init];
- [x addObserver:x forKeyPath:@"x" options:0 context:NULL];
- [xy addObserver:xy forKeyPath:@"x" options:0 context:NULL];
- [y addObserver:y forKeyPath:@"y" options:0 context:NULL];
- [xy addObserver:xy forKeyPath:@"y" options:0 context:NULL];
- PrintDescription(@"control", control);
- PrintDescription(@"x", x);
- PrintDescription(@"y", y);
- PrintDescription(@"xy", xy);
- printf("Using NSObject methods, normal setX: is %p, overridden setX: is %p\n",
- [control methodForSelector:@selector(setX:)],
- [x methodForSelector:@selector(setX:)]);
- printf("Using libobjc functions, normal setX: is %p, overridden setX: is %p\n",
- method_getImplementation(class_getInstanceMethod(object_getClass(control),
- @selector(setX:))),
- method_getImplementation(class_getInstanceMethod(object_getClass(x),
- @selector(setX:))));
- return 0;
- }
- control: <TestClass: 0x104b20>
- NSObject class TestClass
- libobjc class TestClass
- implements methods <setX:, x, setY:, y, setZ:, z>
- x: <TestClass: 0x103280>
- NSObject class TestClass
- libobjc class NSKVONotifying_TestClass
- implements methods <setY:, setX:, class, dealloc, _isKVOA>
- y: <TestClass: 0x104b00>
- NSObject class TestClass
- libobjc class NSKVONotifying_TestClass
- implements methods <setY:, setX:, class, dealloc, _isKVOA>
- xy: <TestClass: 0x104b10>
- NSObject class TestClass
- libobjc class NSKVONotifying_TestClass
- implements methods <setY:, setX:, class, dealloc, _isKVOA>
- Using NSObject methods, normal setX: is 0x195e, overridden setX: is 0x195e
- Using libobjc functions, normal setX: is 0x195e, overridden setX: is 0x96a1a550
- (gdb) print (IMP)0x96a1a550
- $1 = (IMP) 0x96a1a550 <_NSSetIntValueAndNotify>
- 0013df80 t __NSSetBoolValueAndNotify
- 000a0480 t __NSSetCharValueAndNotify
- 0013e120 t __NSSetDoubleValueAndNotify
- 0013e1f0 t __NSSetFloatValueAndNotify
- 000e3550 t __NSSetIntValueAndNotify
- 0013e390 t __NSSetLongLongValueAndNotify
- 0013e2c0 t __NSSetLongValueAndNotify
- 00089df0 t __NSSetObjectValueAndNotify
- 0013e6f0 t __NSSetPointValueAndNotify
- 0013e7d0 t __NSSetRangeValueAndNotify
- 0013e8b0 t __NSSetRectValueAndNotify
- 0013e550 t __NSSetShortValueAndNotify
- 0008ab20 t __NSSetSizeValueAndNotify
- 0013e050 t __NSSetUnsignedCharValueAndNotify
- 0009fcd0 t __NSSetUnsignedIntValueAndNotify
- 0013e470 t __NSSetUnsignedLongLongValueAndNotify
- 0009fc00 t __NSSetUnsignedLongValueAndNotify
- 0013e620 t __NSSetUnsignedShortValueAndNotify
KVO的内部实现以及使用的更多相关文章
- (译)KVO的内部实现
09年的一篇文章,比较深入地阐述了KVO的内部实现. KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到.在其他语言中,这种观察者模 ...
- [转](译)KVO的内部实现
转载自:http://www.cocoachina.com/applenews/devnews/2014/0107/7667.html 09年的一篇文章,比较深入地阐述了KVO的内部实现. K ...
- KVO的内部实现原理
kvo概述 kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作. kvo实现原理 ...
- 你不知道的KVO的内部实现
通过强大的Runtime 实现.第一次观察某个Object 时,runtime 会创建一个新的继承自 object 对应Class 的 subClass.在这个新subClass 里它重写了被观察的k ...
- runtime/KVO等面试题
整理中... 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中 ...
- KVO的使用及底层实现
1.概念 KVO(Key-Value-Observer)也就是观察者模式,是苹果提供的一套事件通知机制.允许对象监听另一个对象特定属性的改变,并在改变时接收到事件,一般继承自NSObject的对象都默 ...
- 使用 KVO 可能会拖慢启动速度
问题  在某一次启动速度优化中,发现最开始的某个 runLoop 中,一个runLoop 耗时很长.发现一个 KVO 变量的初始化消耗了13ms之久,这对启动速度是不可接受了. 源码分析 用 Ins ...
- iOS面试题04-runtime
runtime/KVO等面试题 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个 ...
- iOS设计模式 —— KV0
刨根问底KVO KVO 全称 Key-Value Observing.中文叫键值观察.KVO其实是一种观察者模式,观察者在键值改变时会得到通知,利用它可以很容易实现视图组件和数据模型的分离,当数据模型 ...
随机推荐
- key-value数据库-Redis
1.简介 Redis是完全开源的ANSI C语言编写.遵守BSD协议,高性能的key-value数据库. 1.1特点 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载 ...
- Mac下Kali虚拟机与宿主机共享文件夹
宿主机: 1.创建文件夹.测试文件 ZhangSan-MacBook-Air:~ zhangsan$ mkdir kalishare && cd kalishare/ ZhangSan ...
- 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师
为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...
- Office2016 KMS激活
Office标准版激活 一新买本子需要安装Office,闲来无事就安装了一款Office Standard 2016,网上许多激活秘钥均已过期,无法激活,无奈下选择KMS激活. KMS下载链接如下: ...
- EDI数据导入的注意事项&常见异常处理
EXCEL表格注意事项: • 编码是0开头的,格式必须是文本,否则前面请加字母: • 注意全角半角,中文标点英文标点: • 编号文字类开头和结尾不要有空格,姓名中间也不要 ...
- TFboy养成记 MNIST Classification (主要是如何计算accuracy)
参考:莫烦. 主要是运用的MLP.另外这里用到的是批训练: 这个代码很简单,跟上次的基本没有什么区别. 这里的lossfunction用到的是是交叉熵cross_entropy.可能网上很多形式跟这里 ...
- 条件随机场 Conditional Random Fields
简介 假设你有冠西哥一天生活中的照片(这些照片是按时间排好序的),然后你很无聊的想给每张照片打标签(Tag),比如这张是冠西哥在吃饭,那张是冠西哥在睡觉,那么你该怎么做呢? 一种方法是不管这些照片的序 ...
- js实现谷歌网站统计
基本方法 function ga() { if (window.ga) { window.ga.apply(null, arguments); } else { stack.push(argument ...
- 布局神器display:flex
2009年,W3C提出了一种新的方案--Flex布局,可以简便.完整.响应式地实现各种页面布局.目前已得到所有现在浏览器的支持. flex浏览器支持 一.Flex布局是什么? Flex是Flexi ...
- 51Nod 1293 球与切换器 DP分类
基准时间限制:1 秒 空间限制:131072 KB 有N行M列的正方形盒子.每个盒子有三种状态0, -1, +1.球从盒子上边或左边进入盒子,从下边或右边离开盒子.规则: 如果盒子的模式是-1,则 ...