在对象上调用方法,也能够叫作“传递消息”函数
消息:name 或 selector 能够接受参数,并且还有返回值编码
OC是C的超集,C 语言使用“静态绑定”(static binding),即在编译期就能决定运行时所应调用的函数。编译器在编译代码的时候就已经知道程序中有printHello 与printGoodbye 这两个函数了spa
#import <stdio.h> void printHello() { printf ("Hello World!\n"); } void printGoodbye() { pirntf ("Goodbye, World!\n"); } void doTheThing(int type) { if (type == 0) { printHello (); } else { printGoodbye(); } return 0; }
如果这样:prototype
#import <stdio.h> void printHello() { printf ("Hello World!\n"); } void printGoodbye() { pirntf ("Goodbye, World!\n"); } void doTheThing(int type) { void (*fnc) (); if (type == 0) { fnc = printHello; } else { fnc = printGoodbye; } fnc(); return 0; }
这就是 动态绑定 (dynamic binding), 待调用的函数没法硬编码在指令之中,而是要在运行期读取出来。指针
在Objective-C在中, 若是向某对象传递消息,那就会使用动态绑定机制来决定须要调用的方法。在底层都是普通的C语言函数, 然而对象受到消息以后,究竟该调用哪一个方法则彻底于运行期决定,甚至能够在程序云心时改变,这些特性使OC 称为一门真正动态语言code
给对象发送消息以下:对象
id returnValue = [someObject messageName:parameter];
someObject :接受者、receiverblog
messageName:选择子、selectorcmd
选择子与参数合起来称为”消息“(message)原型
编译器将消息转换成C语言函数调用,所调用函数乃是消失机制中的核心函数 objc-msgSend,其原型(prototype)以下:
void objc_msgSengd(id self, SEL cmd, ...)
第一个参数表明接受者,第二个参数表明选择子(SEL是选择子的类型)
id returnValue = objc_msgSend(someObject, @selector(messageName:), parameter);
其余函数:
objc_msgSend_stret: 若是待发送的消息要返回结构体,那么可交由此函数处理。
objc_msgSend_fpret:若是消息返回的是浮点数,可交由此函数处理。
objc_msgSendSuper:给超类发消息。
Objective-C 对象的每一个方法均可以视为简单的C函数 其原型:
<return_type> Class_selector(id self, SEL _cmd, ...)
每一个类都有一张表格,其中的指针都会指向这种函数,而选择子的名称则是查表时所用的“键”。 objc_msgSend等函数正是经过这张表格来寻找应该执行的方法并跳至其实现的。