240 发简信
IP属地:广东
  • 猜测是对的。
    msgSend: 原理
    一、 发送消息是会查询当前 Class 的cache 缓存中是否有method。
    如果没有就到 methodList 中是否有与 sel 相对应的方法实现,
    如果有直接执行。如果没有, 执行动态解析。
    二、动态解析中不管是否有添加新的IMP给SEL。都会再次执行 一 步骤。
    如果动态解析中添加了方法实现,那么在重复执行一步骤的时候就结束了。
    如果没有添加,就会来到消息转发。
    三消息转发: forwardingTargetForSelector: 走消息转发流程。
    所以不论返回的值是YES或者NO。只要methodList和动态解析都没有找到函数实现,就会来到forwardingTargetForSelector。
    至于返回值是YES或NO的区别,真没区别,看官方的源码可以看到这个返回值没有用来做什么判断。
    这个时候如果我们没有重写forwardingTargetForSelector ,添加转发对象及IMP。那么就会来到methodSignatureForSelector。这个是用来返回方法签名的,其实就是要求返回Types编码。
    如果这个方法我们还是没有重写。那么就会报经典错误“unrecognized selector sent to instance ”
    @王英良不止是名字

    iOS Runtime详解

    Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍...

  • @王英良不止是名字 performSelect: 方法底层判断了传入的 sel 是否存在, 不存在报方法不存在,存在调用 msgSend:方法发送消息。
    按你说的这样如果方法不存在那根本不会调用msgSend方法呀,又何来的消息转发流程呢。。。

    iOS Runtime详解

    Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍...

  • 是的。
    这篇少说了cache缓存机制。

    iOS Runtime详解

    Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍...

  • 监听后:被观察对象的 isa 指向 —— > 新创建的子类NSKVONotifying_A 类。 新A 继承自 本A类。
    监听前:被观察对象的 isa 指向 ——> A类;
    反过来想,被观察对象的 isa 如果不是指向新的子类。那动态创建新的子类又有何用呢?对吧

    iOS Runtime详解

    Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍...

  • resolveClassMethod是添加类方法,object_getClass(self)得到的是元类对象,类方法添加进元类的method中;
    resolveInstanceMethod是添加对象方法,[self class] 得到的是类对象,对象方法添加进类对象中。
    提醒:[[self class] class]是无法获得元类对象的。

    iOS Runtime详解

    Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍...

  • 谢谢楼主,看完马上下载拍拍贷。可是拍拍贷只找到了借款的。没有理财。

    刚出道的理财小白如何实现年化10%的收益率

    昨天写了一篇文章《八年抗战:我从零到70万的理财经历》,把我自己这几年来理财的心路历程做了一个总结,得到了广大读者的喜欢和好评,让我受宠若惊。其中一位读者问我,有没有10%的...

  • :kissing_heart: 好开森

    27 款 iOS 开源库 分享

    开发者们花费大量宝贵的时间创造出如此惊人的东西,然后与其他人分享,而不要求任何回报。开源作者和贡献者们,真的非常令人钦佩!!! 本文例举了一些 iOS 开源库。多数库支持 C...

  • 第27个. iOS-charts 没有带上github地址。 :sweat:

    27 款 iOS 开源库 分享

    开发者们花费大量宝贵的时间创造出如此惊人的东西,然后与其他人分享,而不要求任何回报。开源作者和贡献者们,真的非常令人钦佩!!! 本文例举了一些 iOS 开源库。多数库支持 C...

  • @给你快乐 @张云龙 谢谢 :kissing_heart:

    https请求之iOS客户端---AFNetworking

    说点什么 自从出了iOS 9.0之后,Apple要求使用更安全的协议HTTPS,刚开始我们还可以通过在info.plist文件里添加键值对:App Transport Sec...