iOS方法在runtime中的調用流程

Runtime中具體的方法調用流程

  1. 首先,在相應操做的對象中的緩存方法列表中找調用的方法,若是找到,轉向相應的實現並執行;
  2. 若是沒找到,在相應操做的對象中的方法列表中找調用的方法,若是找到,轉向相應的實現並執行;
  3. 若是沒找到,去父類指針所指向的對象中執行一、2;
  4. 以此類推,若是一直到根類都沒有找到,轉向攔截調用,走消息轉發機制
  5. 若是沒有重寫攔截調用方法,程序報錯;

攔截調用

在方法調用中說到了,若是沒有找到方法就會轉向攔截調用。
那麼什麼是攔截調用呢?
攔截調用就是,在找不到調用的方法程序崩潰以前,你有機會經過重寫NSObject的四個方法來處理:緩存

+ (BOOL)resolveClassMethod:(SEL)sel;
+ (BOOL)resolveInstanceMethod:(SEL)sel;
//後兩個方法須要轉發到其餘的類處理
- (id)forwardingTargetForSelector:(SEL)aSelector;
- (void)forwardInvocation:(NSInvocation *)anInvocation;

攔截調用的整個流程即Objective-C的消息轉發機制。其具體流程以下圖:
流程圖函數

[image:A6043816-2585-4477-BE08-5C38F761E7E6-417-00001981CC42BFC1/message_forwarding.png]
由上圖可見,在一個函數找不到時,runtime提供了三種方式去補救:spa

  1. 調用resolveClassMethod:(SEL)sel給個機會讓類添加這個實現這個函數
  2. 調用forwardingTargetForSelector:(SEL)aSelector讓別的對象去執行這個函數
  3. 調用forwardInvocation:(NSInvocation *)anInvocation(函數執行器)靈活的將目標函數以其它形式執行

若是都不中,調用doesNotRecognizeSelector拋出異常指針

相關文章
相關標籤/搜索