当执行[object selector:para]的时候,发生了什么?

来源:互联网 发布:詹姆斯首秀数据 编辑:程序博客网 时间:2024/04/29 13:26

本来只是想写一下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指向的函数.

0 0
原创粉丝点击