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