Effective Objective-C 2.0 — 第11条:理解 objc_msgSend 的做用

  • 消息由接受者、选择子及参数构成。给某对象“发送消息” (invoke a message) 也就至关于在该对象上“调用方法”(call a method)
  • 发给某对象的所有信息都要由“动态消息派发系统”(dynamic message dispatch system)来处理,该系统会查出对应的方法,并执行其代码。

 

在对象上调用方法,也能够叫作“传递消息”函数

消息: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等函数正是经过这张表格来寻找应该执行的方法并跳至其实现的。

相关文章
相关标签/搜索