在Objective传递消息使用objc_msgSend方法,消息有“名称”或"选择子"(selector),可以接受参数,而且可能还有返回值。
在Objective-C中,如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。在底层,所有方法都是普通的C语言函数,然而对象收到消息之后,究竟该调用哪个方法则完全于运行期决定,甚至可以在程序运行时改变,这些特性使得Objective-C 成为一门真正的动态语言。
给对象发送消息可以这样来写:
id returnValue = [someObject messageName:parameter];
消息传递“原型”如下: void objc_msgSend(id self,SEL cmd,...)
这是个“参数个数可变的函数”,能接受两个或两个以上的参数。第一个参数代表接受者,第二个参数代表选择子(SEL是选择子的类型),后续参数就是消息中的那些参数,其顺序不变。选择子指的就是方法的名字。
编译器:会把那个OC的写法转换为
id returmValue = objc_msgSend(someObject,@selector(messageName:),parameter);
objc_msgSend 函数会依据接受者与选择子的类型来调用适当的方法。为了能完成此操作,该方法需要再接受者所属的类中搜寻其“方法列表”,如果能找到与选择子名称相符的方法,就跳至其实现代码。若找不到,那就沿着继承体系继续向上查找,等找到合适的方法之后再跳转。如果最终还是找不到相符的方法,那就执行“消息转发”操作。(这样执行方法会有一定的性能影响,这里objc_msgSend会把找到的方法缓存在“快速映射表”)
1,消息由接受者,选择子及参数构成。给某对象“发送消息”,也就相当于在该对象上“调用方法”
2,发给某对象的全部消息都要由“动态消息派发系统”来处理,该系统会查出对应 的方法,并执行器代码。