摘要: 如果我們在 Objective C 中向一個對象發送它無法處理的消息,會出現什么情況呢?根據前文《深入淺出Cocoa之消息》的介紹,我們知道發送消息是通過 objc_send(id, SEL, ...) 來實現的,它會首先在對象的類對象的 cache,method list 以及父類對象的 cache, method list 中依次查找 SEL 對應的 IMP;如果沒有找到且實現了動態方法決議機制就會進行決議,如果沒有實現動態方法決議機制或決議失敗且實現了消息轉發機制就會進入消息轉發流程,否則程序 crash。也就是說如果同時提供了動態方法決議和消息轉發,那么動態方法決議先于消息轉發,只有當動態方法決議依然無法正確決議 selector 的實現,才會嘗試進行消息轉發。在前文中,我并沒有詳細講解動態方法決議,因此本文將詳細介紹之。
閱讀全文