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;方法 則會觸發該方法 做最後的轉發操作
使用:使用訊息轉發機制 實現多重代理 以及訊息攔截器(面向切面開發)