zoukankan      html  css  js  c++  java
  • 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 这两个函数了

    #import <stdio.h>
    void printHello() {
        printf ("Hello World!
    ");
    }
    void printGoodbye() {
         pirntf ("Goodbye, World!
    ");
    }
    void doTheThing(int type) {
        if (type == 0) {
        printHello ();
        } else {
            printGoodbye();
        }
        return 0;
    }

    若是这样:

    #import <stdio.h>
    void printHello() {
        printf ("Hello World!
    ");
    }
    void printGoodbye() {
         pirntf ("Goodbye, World!
    ");
    }
    void doTheThing(int type) {
        void (*fnc) ();
        if (type == 0) {
        fnc  =  printHello;
        } else {
            fnc  = printGoodbye;
        }
      fnc();  
        return 0;
    }

    这就是 动态绑定 (dynamic binding), 待调用的函数无法硬编码在指令之中,而是要在运行期读取出来。

    在Objective-C在中, 如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。在底层都是普通的C语言函数, 然而对象受到消息之后,究竟该调用哪个方法则完全于运行期决定,甚至可以在程序云心时改变,这些特性使OC 称为一门真正动态语言

    给对象发送消息如下:

    id returnValue = [someObject messageName:parameter];

    someObject :接受者、receiver

    messageName:选择子、selector

    选择子与参数合起来称为”消息“(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等函数正是通过这张表格来寻找应该执行的方法并跳至其实现的。

  • 相关阅读:
    Day-11 闭包和迭代器
    Day-01 Python基础
    Day-10 函数的进阶
    Day-09 初识函数
    Day-08 文件操作
    Day-07 基础数据类型补充 set集合 深浅拷贝
    Day-06 小数据池 再谈编码
    Day-05 基础数据类型字典dict
    Day-04 基础数据类型list, tuple
    NodeJs获取两个日期间的所有日期
  • 原文地址:https://www.cnblogs.com/IDRI/p/5130027.html
Copyright © 2011-2022 走看看