当执行[object selector:para]的时候,发生了什么?
2014-02-20 23:54
381 查看
本来只是想写一下SEL,IMP这些类型到底有什么意义的,结果,网上查资料挺丰富的,干脆把整个过程都捋捋.
在Objective-C中的方法调用,其实是调用下面这个函数向对象发送一个信息.
id objc_msgSend(id self, SEL op, ...)
self就是接受该消息的对象,...就是参数列表,这里比较特别的是SEL这个类型.
从Apple的文档中,可以看到
typedef struct objc_selector *SEL;
并解释了SEL代表了一个Method Selector.而Method Selecto则代表了Method在运行时的名字.
光看文档解释,可能也不是很清楚,接下来,我们慢慢发掘其中的奥妙.
除了SEL,在文档中,还能看到IMP这种类型.
id (*IMP)(id, SEL, ...)
其实就是个函数指针嘛,指到哪呢?必然是指到函数的开始地址.
因为苹果对我们隐藏了实现的细节,所以我只能根据收集的资料猜测,调用[object selector:para]方法时,
(1)调用sel_registerName("selector")来获取SEL
(2)调用objc_msgSend(object, SEL, para)
(3)在objc-msgSend中通过SEL获取到IMP
(4)调用IMP指向的函数.
在Objective-C中的方法调用,其实是调用下面这个函数向对象发送一个信息.
id objc_msgSend(id self, SEL op, ...)
self就是接受该消息的对象,...就是参数列表,这里比较特别的是SEL这个类型.
从Apple的文档中,可以看到
typedef struct objc_selector *SEL;
并解释了SEL代表了一个Method Selector.而Method Selecto则代表了Method在运行时的名字.
光看文档解释,可能也不是很清楚,接下来,我们慢慢发掘其中的奥妙.
除了SEL,在文档中,还能看到IMP这种类型.
id (*IMP)(id, SEL, ...)
其实就是个函数指针嘛,指到哪呢?必然是指到函数的开始地址.
因为苹果对我们隐藏了实现的细节,所以我只能根据收集的资料猜测,调用[object selector:para]方法时,
(1)调用sel_registerName("selector")来获取SEL
(2)调用objc_msgSend(object, SEL, para)
(3)在objc-msgSend中通过SEL获取到IMP
(4)调用IMP指向的函数.
相关文章推荐
- 黑马程序员_object类以及常见异常
- Objective-C中的Json解析,NSUTF8Encoding,
- Object-C中对自定义类实现<NSCopying>协议
- 各语言设计思想的独特之处:C/C++、Java、Python、Objective C、Groovy
- 初识Qt Object 类
- 实现RemObject Hydra实现插件库注意要点
- 简单例子让你很好的理解:协议与委托 (Protocol and Delegate)
- (译)使用判别训练的部件模型进行目标检测 Object Detection with Discriminatively Trained Part Based Models
- objective c 语法
- 关于 Ext.EventObject中的getWheelDelta()方法无效的说明
- Java Object类中的方法
- java.lang.NoClassDefFoundError: org/objectweb/asm/Type
- android 读取json数据(遍历JSONObject和JSONArray
- iOS中关联对象的简单使用(objc_setAssociatedObject)
- Object.hideFlags 隐藏标识
- jquery 将表单对象转换为object对象
- HOGgles: Visualizing Object Detection Features的相关信息
- 17,Objective-C Foundation框架中的NSDate
- Outlook Object Model Overview
- object-c学习:@property (nonatomic,retain)中的nonatom和retain的意思