美文网首页ios面试我爱编程
Runtime应用系列:消息机制

Runtime应用系列:消息机制

作者: 羊非鱼丶 | 来源:发表于2018-07-26 15:40 被阅读26次

OC中都是通过[MyClass classMethod]调用一个方法。而它的底层实现如何呢?接下来写一个简单的方法调用:

#import "MsgSend.h"

@implementation MsgSend
+ (void)myMethod {
    NSLog(@"This is a class method");
}
@end

int main(int argc, char * argv[]) {
    @autoreleasepool {
        [MsgSend myMethod];
    };
    return 0;
}

接下来将OC代码转为C++代码,看一下具体的底层实现。
使用终端cd到当前项目目录下,使用命令行clang -rewrite-objc MsgSend.mMsgSend.m转为C++代码,执行完毕后项目目录下会生成MsgSend.cpp文件,在cpp文件中找到main函数对应的C++代码

int main(int argc, char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
        ((void (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("MsgSend"), sel_registerName("myMethod"));
    };
    return 0;
}

通过以上代码我们可以知道[MsgSend myMethod]被转换成了objc_msgSend的调用,第一个参数objc_getClass("MsgSend")是调用的类,第二个参数是sel_registerName("myMethod")调用的方法。

那么objc_msgSend是怎么确定应该调用哪个方法的呢?
它有一个动态查找过程:

  1. 在相应对象的缓存方法列表中(objc_classcache)查找调用的方法
  2. 如果没有找到,则在相应的对象方法列表中查找调用的方法
  3. 如果还没找到,就到父类指针指向的对象中执行1、2
  4. 如果直到根类都没有找到就进行消息转发,给自己保留处理找不到方法这一状况的机会
  5. 调用resolveInstanceMethod,有机会让类添加这个函数的实现
  6. 调用forwardingTargetForSelector,让其他对象执行这个函数
  7. 调用forwardInvocation,更加灵活的处理函数调用
  8. 如果通过以上操作都没有找到,也没有进行特殊处理,就抛出doesNotRecognizeSelector异常
    下图(1-4步)表示根据类的层级逐层往上查找方法表中有没有对应的方法
    根据类的层级查找方法

有三次机会处理方法找不到的情况。利用这种方式可以让所有方法通过消息转发跟踪到一个类的所有方法的调用。下图表示消息转发机制(5-7步)

消息转发机制

相关文章

  • Runtime应用系列:消息机制

    OC中都是通过[MyClass classMethod]调用一个方法。而它的底层实现如何呢?接下来写一个简单的方法...

  • Runtime那些事儿(消息机制)

    Runtime那些事儿(消息机制) Runtime那些事儿(消息机制)

  • Runtime 的应用

    前面我们说到:Runtime 消息传递机制Runtime 消息转发机制Runtime 交换方法今天我们来谈谈Run...

  • iOS runtime

    runtime 是 oc 语音的基础首先runtime的核心机制是消息机制 也就是oc的消息机制首先oc的消息机制...

  • Runtime—实战篇

    目录: Runtime简介 runtime实战应用代码一:OC代码对象调用代码 -> 消息发送机制代码 的转换代码...

  • iOS - Runtime - 概念和方法交换

    runtime的概述runtime的相关概念runtime消息机制消息传递动态方法解析消息转发runtime的作用...

  • iOS开发_记录runtime常用的用法

    最近看了下iOS攻城狮DWQ的快速上手Runtime系列文章,记录下runtime的常用用法。 一、消息机制 定义...

  • 深入浅出Runtime

    Runtime运行时 目录 一、runtime 简介二、消息机制<了解>2.1 消息机制原理2.2 消息调用流程三...

  • 自己实现OC的KVO

    Runtime系列文章在这:Runtime介绍---术语介绍Runtime应用--动态添加方法Runtime应用-...

  • 2018-02-01

    《Objective-C runtime系列 1》消息发送及转发机制 Objective-C是基于C,加入了面...

网友评论

    本文标题:Runtime应用系列:消息机制

    本文链接:https://www.haomeiwen.com/subject/prubmftx.html