Apr 22

Object-C 消息函数是如何工作的?

编程心得

关于这个问题, 在看object-c手册的时候大概已经知道答案了,只是没有想到object-c的解决方法真的是这样,和一般的脚本语言差不多,只是通过编译器实现了一层运行时系统.

我们知道, 在object-c里消息(成员函数)是运行期绑定的,编译器把类似

[receiver message]

的函数调用转换为,消息发送:

objc_msgSend( receiver, selector )

这里的selector就是在运行期绑定的成员函数, 可以想象selector是通过在继承体系中递归向上查找的,object-c仅仅在找到后做了一个cache,当消息具有多个参数时,也有如下转换:

objc_msgSend( receiver, selector, arg1, arg2, … )

为了便于在运行期决定selector, 每个objc类都维护了一个dispatch table, 通过名为isa的指针指向, 所有从NSObject继承的类都自动拥有isa指针. 下图是object-c里关于查找selector的过程:

 image

为了效率考虑, 在编译后的代码中不使用函数字符串作为key来查找selector, 而是用过一个objc编译器保证唯一的标识符来做key查找,当然程序员可以使用字符串来查找, 例如:

id someSelector = NSSelectorFromString( msgName );

同时可以反向操作, 从一个selector返回其对应的函数名字:

NSString* methodName = NSStringFromSelector( someSelector );

基本上, 具备这个两个操作, objc就具有内省能力了.

to "Object-C 消息函数是如何工作的?"

Leave a Reply