美文网首页
iOS之消息传递机制

iOS之消息传递机制

作者: 賣女孩的小火柴 | 来源:发表于2020-12-03 15:52 被阅读0次

       在Objective-C中使用对象调用方法非常普遍。用Objective-C的术语来讲,这叫做“给某个对象发送某条消息”。顾消息有“名称”或“选择子(selector)”之说。消息是可以接受参数,还可以有返回值。在Objective-C中给对象发送消息是如下的格式:

UIImage *image = [UIImage imageNamed:@""];

        在上面代码中,UIImage叫做方法调用者,也叫做接受者。imageNamed:是方法名,也叫选择子。选择子与参数合起来叫做”消息“。在运行时,编译器会把上面这个格式的方法调用转化为一条标准的C语言函数调用,该函数就是鼎鼎有名的objc_msgSend(),该函数是消息objc里在运行时传递机制中的核心函数,其原型如下:

void objc_msgSend(id self, SEL cmd, ...)

        这是一个参数个数可变的函数。能接收两个或两个以上的参数,第一个参数代表接受者,第二个参数代表选择子。后续参数就是消息中的那些参数,其顺序不变。接受者就是调用方法的对象或者类(本质上类也是对象,叫做类对象)。选择子就是指的方法的名称,选择子和方法这两个词经常交替使用,其实是指的一个意思。运行时,上面Objc的方法调用会被翻译成一条C语言的函数调用,如下:

UIImage *image = objc_msgSend(UIImage,  @selector(imageNamed:), @"")

在上面我们也知道了方法的调用,下面我们来说一说消息传递机制:

        1.首先去该类的方法 cache 中查找,如果找到了就返回它。

        2.如果在 cache 中没有找到,就去该类的方法列表中查找。如果在该类的方法列表中找到了,则将 IMP 返回,并将 它加入 cache 中缓存起来。根据最近使用原则,这个方法再次调用的可能性很大,缓存起来可以节省下次调用再次查找的开销。

        3.如果在该类的方法列表中没找到对应的 IMP,在通过该类结构中的 super_class指针在其父类结构的方法列表中去查找,直到在某个父类的方法列表中找到对应的 IMP,然后返回它,并加入 cache 中。

        4.如果在自身以及所有父类的方法列表中都没有找到对应的 IMP,则看是不是可以进行动态方法决议。

        5.如果动态方法决议没能解决问题,则进行消息转发流程。

相关文章

  • iOS之消息传递机制

    在Objective-C中使用对象调用方法非常普遍。用Objective-C的术语来讲,这叫做“给某个对象发...

  • 几种消息传递机制的比较

    本文主要借鉴了 objc上的文章 消息传递机制 iOS中,消息传递机制主要有 5种 KVO Notificatio...

  • IOS消息传递机制

    ios的消息传递机制分为三个阶段:消息发送阶段,动态解析阶段,消息转发阶段。 消息发送阶段: 当ios的对象调用方...

  • iOS开发基础:消息传递机制的不同与缺陷

    iOS中的消息传递机制有以下几种: 代理(Delegation) 通知(NSNotification) BLOCK...

  • 【iOS】消息传递机制和消息转发机制

    在Objective-C中,方法的调用理解为对象接受消息。 运行时调用的方法告诉对象要干什么,给对象传递一个消息。...

  • iOS消息转发机制

    消息转发机制: 消息转发机制是相对于消息传递机制而言的。 1、消息(传递)机制 RunTime简称运行时。就是系统...

  • EventBus总结

    一、Android消息传递之Handler消息机制(www.cnblogs.com/whoislcj/p/5590...

  • 深入了解runtime

    iOS经典讲解之[self class]和[super class]的区别 iOS的消息机制和消息转发 Objec...

  • Runtime消息传递总结

    iOS中类找不到方法时消息处理机制 iOS~runtime理解 一、正常的消息传递 在C等语言中,调用一个方法就是...

  • 消息传递机制

网友评论

      本文标题:iOS之消息传递机制

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