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,没有找到相关的方法。

Objective-C nil,实例对象发送消息_第1张图片
向实例对象发送消息

你可能感兴趣的:(Objective-C nil,实例对象发送消息)