Objective—C是面向运行时的语言,就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。这就给你很大的灵活性,你可以按需要把消息重定向给合适的对象,你甚至可以交换方法的实现。最重要的还是消息机制。
C语言使用“静态绑定”,在编译期就能决定运行时所应调用的函数。
在Objective-c中,如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。对象接收到消息之后,究竟该调用哪个方法则完全于运行期决定,甚至可以在程序运行时改变。这些特性使得Objective-c成为一门真正的动态语言。
id returnValue = [someObject messageName:parmeter];
给哪个对象发送消息,该对象称为接收者;调用的方法叫做选择子;选择子和参数合起来称为“消息”。
编译器看到此消息后,将其转换为一条标准的C语言函数:
void objc_msgSend(id self, SEL cmd, ...);
该函数参数是可变的,第一个参数代表接收者,第二个参数代表选择子,之后的参数就是方法的里面参数。
objc_msgSend函数会根据接收者与选择子的类型来调用适当的方法。为了完成此方法操作,该方法需要在接收者所属的类中搜寻其“方法列表”,如果能找到与选择子名称相符的方法,就跳至其实现代码。若找不到,那就沿着继承体系继续向上查找,等找到合适的方法再跳转。如果最终还是没有找到相符的方法,那就执行“消息转发”操作。
objc_msgsend会将匹配结果缓存在“快速映射表”里面,每个类都有这么一块缓存,如果之后发送相同的消息,执行会很快的。
摘抄《Effective Objective_c2.0 编写高质量ios与OS X代码的52歌有效方法》