為什么向nil對(duì)象發(fā)送消息的時(shí)候慢洋,不會(huì)崩潰?向一個(gè)實(shí)例對(duì)象發(fā)送消息的時(shí)候沒找到相關(guān)的方法會(huì)拋出cash陆盘?
1.首先Objectvice-c的語言的動(dòng)態(tài)運(yùn)行時(shí);
????每個(gè)對(duì)象調(diào)用方法的時(shí)候都是調(diào)用Object_msgSend(self, method,value).
????當(dāng)self為空的時(shí)候直接返回的空普筹,并不會(huì)拋出cash.
2.而為什么向?qū)嵗龑?duì)象發(fā)送消息的時(shí)候,實(shí)例對(duì)象沒有找到method時(shí)會(huì)拋出cash.
? ? 實(shí)際操作是這樣的礁遣,
????首先判斷self是否為空斑芜,如果為空Retrun nil,
????不為空祟霍,找到該類的isa指針指向的class對(duì)象杏头,名為objc-class的結(jié)構(gòu)題中objc-cache中查找????selector;如果找到返回selector沸呐;否則
????在本class中的objc_method_list中查找selector醇王;如果找到緩存到objc-cache中,并返回selector崭添;否則
????在父class中查找objc_method_list中查找selector寓娩,依次往上查找,直到找到selector為止呼渣,填充到objec-cache中并返回selector棘伴;否則(可行)
????如果在可行的情況下調(diào)用_class_resolveMethod,動(dòng)態(tài)resolve一個(gè)method屁置,不緩存焊夸,return selector;否則(可行)
????如果可能轉(zhuǎn)發(fā)這個(gè)selector蓝角,否則
????拋出cash阱穗,沒有找到相關(guān)的方法饭冬。