IMP 的查找 過程

objc_msgSend 會根據方法選標 SEL 在類結構的方法列表中查找方法實現IMP。這裏頭有一些文章,咱們在前面的類結構中也看到有一個叫objc_cache *cache 的成員,這個緩存爲提升效率而存在的。每一個類都有一個獨立的緩存,同時包括繼承的方法和在該類中定義的方法。。緩存

查找IMP 時:函數

1,首先去該類的方法 cache 中查找,若是找到了就返回它;spa

2,若是沒有找到,就去該類的方法列表中查找。若是在該類的方法列表中找到了,則將 IMP 返回,並將它加入cache中緩存起來。根據最近使用原則,這個方法再次調用的可能性很大,緩存起來能夠節省下次調用再次查找的開銷。3,3,若是在該類的方法列表中沒找到對應的 IMP,在經過該類結構中的 super_class指針在其父類結構的方法列表中去查找,直到在某個父類的方法列表中找到對應的IMP,返回它,並加入cache中。指針

4,若是在自身以及全部父類的方法列表中都沒有找到對應的 IMP,則進入下文中要講的消息轉發流程。orm

便利函數:對象

咱們能夠經過NSObject的一些方法獲取運行時信息或動態執行一些消息:繼承

class 返回對象的類;it

isKindOfClass 和 isMemberOfClass檢查對象是否在指定的類繼承體系中;form

respondsToSelector 檢查對象可否相應指定的消息;class

conformsToProtocol 檢查對象是否實現了指定協議類的方法;

methodForSelector 返回指定方法實現的地址。

performSelector:withObject 執行SEL 所指代的方法。

相關文章
相關標籤/搜索