1. 程式人生 > >OC的訊息傳送以及轉發機制

OC的訊息傳送以及轉發機制

SEL:Objective-C在編譯時,會依據每一個方法的名字、引數序列,生成一個唯一的整型標識(Int型別的地址),這個標識就是SEL.本質上,SEL只是一個指向方法的指標.

Method:Method = SEL + IMP + method_types,相當於在SEL和IMP之間建立了一個對映

IMP:實際上是一個函式指標,指向方法實現的首地址

 

 

 

 一、OC的訊息機制

 caches the selectors and addresses of methods as they are used

   the messaging routine first checks the cache of the receiving object’s class (on the theory that a method that was used once may likely be used again). If the method selector is in the cache, messaging is only slightly slower than a function call

  1.1先從快取中查詢方法 如果沒有去類的方法列表中查詢

  1.2通過object的isa指標找到它的class

  1.3在class的method_list中找到foo

  1.4如果class中沒找到foo,則繼續往他的superclass中查詢

  1.5一旦找到foo這個函式,就去執行對應的方法實現(IMP)如果沒有找到則會進行2.1方法

二、動態方法決議與訊息轉發

 

  如果在類中沒有找到需要呼叫的方法的實現 動態新增方法操作

     2.1程式執行時動態的為一個selector提供實現,如果我們添加了函式的實現,並返回YES,執行時系統會重啟一次訊息的傳送過程,呼叫動態新增的方法 返回NO則會執行2.2的方法

     - (BOOL)resolveInstanceMethod:(SEL)sel

     +  (BOOL)resolveClassMethod:(SEL)sel

 

 

  如果2.1方法返回了NO則執行訊息轉發

     2.2呼叫- (id)forwardingTargetForSelector:(SEL)aSelector方法如果這個方法中返回的不是nil或者self,執行時系統將把訊息傳送給返回的那個物件 如果返回了nil 則執行2.3

     2.3如果類中實現了

     - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector方法的話會觸發該方法(用於描述被轉發的訊息) 如果返回nil則程式崩潰 否則執行2.4

     2.4 如果類中實現了

     -(void)forwardInvocation:(NSInvocation *)anInvocation;方法 則會觸發該方法 做最後的轉發操作

 

使用:使用訊息轉發機制 實現多重代理 以及訊息攔截器(面向切面開發)