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其实是一种观察者模式,观察者在键值改变时会得到通知,利用它可以很容易实现视图组件和数据模型的分离,当数据模型 ...
随机推荐
- JIT——即时编译的原理
介绍 java 作为静态语言十分特殊,他需要编译,但并不是在执行之前就编译为本地机器码. 所以,在谈到 java的编译机制的时候,其实应该按时期,分为两个部分.一个是 javac指令 将java源码 ...
- OC语言的面向对象—类和对象、方法
1. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 ➢ 打开电脑 ➢ ...
- 变位词(0029)-swustoj
变位词(0029)水题 变位词如果两个单词的组成字母完全相同,只是字母的排列顺序不一样,则它们就是变位词,两个单词相同也被认为是变位词.如tea 与eat , nic 与cin, ddc与dcd, a ...
- Apache服务器配置
之前做代码一直按照传统化的方法部署别人的网站,但是一直不成功,尝试了很多次最后才发现时虚拟主机的问题 使用apache默认为127.0.0.1和网站的配置发生冲突. 因此在apache的conf文件夹 ...
- 《Linux命令行与shell脚本编程大全》第二十章 正则表达式
20.1 什么是正则表达式 20.1.1 定义 正则表达式是你所定义的模式模板.linux工具可以用它来过滤文本. 正则表达式利用通配符来描述数据流中第一个或多个字符. 正则表达式模式含有文本或特殊字 ...
- codeforces 893A Chess For Three 模拟
893A Chess For Three 思路: 直接模拟即可,第一盘永远是A与B开始 代码: #include <bits/stdc++.h> using namespace std; ...
- DIN(Deep Interest Network of CTR) [Paper笔记]
背景 经典MLP不能充分利用结构化数据,本文提出的DIN可以(1)使用兴趣分布代表用户多样化的兴趣(不同用户对不同商品有兴趣)(2)与attention机制一样,根据ad局部激活用户兴趣相关的兴趣(用 ...
- 浅copy 与 深copy
import copy names = ["zhangyang", 'guyun', 'xiangpeng', ['jack','tom'], 'xuliangchen'] nam ...
- SALM入门笔记(1):特征点的匹配
SLAM 主要分为两个部分:前端和后端,前端也就是视觉里程计(VO),它根据相邻图像的信息粗略的估计出相机的运动,给后端提供较好的初始值.VO的实现方法可以根据是否需要提取特征分为两类:基于特征点的方 ...
- Solr服务在Linux上的搭建
一.系统环境 注:欢迎大家转载,非商业用途请在醒目位置注明本文链接和作者名dijia478即可,商业用途请联系本人dijia478@163.com. CentOS-6.7-i386-bin-DVD1 ...