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