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

来源:互联网 发布:淘宝举证在哪里 编辑:程序博客网 时间:2024/06/06 05:36

关于这个问题, 在看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的过程: 为了效率考虑, 在编译后的代码中不使用函数字符串作为key来查找selector, 而是用过一个objc编译器保证唯一的标识符来做key查找,当然程序员可以使用字符串来查找, 例如: id someSelector = NSSelectorFromString( msgName ); 同时可以反向操作, 从一个selector返回其对应的函数名字: NSString* methodName = NSStringFromSelector( someSelector ); 基本上, 具备这个两个操作, objc就具有内省能力了.

http://blog.iieeg.com/siney/category/%e6%b8%b8%e6%88%8f%e5%bc%80%e5%8f%91/c/
原创粉丝点击