为什么向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,没有找到相关的方法。
向实例对象发送消息