> > 技术-博客 > Object-C 消息函数是如何工作的
 

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

2011-01-26 15:56:29
 

关于这个问题, 在看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就具有内省能力了.

 
相关话题推荐
 
相关新闻:
发贴区
  评论仅表达个人看法,并不表明爱酷游同意其观点或证实其描述。
   
icoou资讯76小时热门排行
icoou人气图片推荐
酷友推荐
焦点推荐
24小时前沿动态
标题  
点击数 
主题推荐

话题推荐
视频专题

娱乐专题