Objective-C nil,实例对象发送消息

为什么向nil对象发送消息的时候,不会崩溃?向一个实例对象发送消息的时候没找到相关的方法会抛出cash?

1.首先Objectvice-c的语言的动态运行时;

    每个对象调用方法的时候都是调用Object_msgSend(self, method,value).

    当self为空的时候直接返回的空,并不会抛出cash.

2.而为什么向实例对象发送消息的时候,实例对象没有找到method时会抛出cash.

    实际操作是这样的,

    首先判断self是否为空,如果为空Retrun nil,

    不为空,找到该类的isa指针指向的class对象,名为objc-class的结构题中objc-cache中查找    selector;如果找到返回selector;否则

    在本class中的objc_method_list中查找selector;如果找到缓存到objc-cache中,并返回selector;否则

    在父class中查找objc_method_list中查找selector,依次往上查找,直到找到selector为止,填充到objec-cache中并返回selector;否则(可行)

    如果在可行的情况下调用_class_resolveMethod,动态resolve一个method,不缓存,return selector;否则(可行)

    如果可能转发这个selector,否则

    抛出cash,没有找到相关的方法。

向实例对象发送消息
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 消息发送和转发流程可以概括为:消息发送(Messaging)是 Runtime 通过 selector 快速查找 ...
    lylaut阅读 1,910评论 2 3
  • 关于OC中的消息发送的实现,在去年也看过一次,当时有点不太理解,但是今年再看却很容易理解。 我想这跟知识体系的构建...
    咖啡绿茶1991阅读 984评论 0 1
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,235评论 0 7
  • 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的...
    lylaut阅读 828评论 0 4
  • 文中的实验代码我放在了这个项目中。 以下内容是我通过整理[这篇博客] (http://yulingtianxia....
    茗涙阅读 949评论 0 6