首先,在相應操作的物件中的快取方法列表中找呼叫的方法,如果找到,轉向相應的實現並執行;
如果沒找到,在相應操作的物件中的方法列表中找呼叫的方法,如果找到,轉向相應的實現並執行;
如果沒找到,去父類指標所指向的物件中執行1、2;
以此類推,如果一直到根類都沒有找到,轉向攔截呼叫,走訊息**機制;
如果沒有重寫攔截呼叫方法,程式報錯;
在方法呼叫中說到了,如果沒有找到方法就會轉向攔截呼叫。
那麼什麼是攔截呼叫呢?
攔截呼叫就是,在找不到呼叫的方法程式崩潰之前,你有機會通過重寫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提供了三種方式去補救:
呼叫resolveclassmethod:(sel)sel給個機會讓類新增這個實現這個函式
呼叫forwardingtargetforselector:(sel)aselector讓別的物件去執行這個函式
呼叫forwardinvocation:(nsinvocation *)aninvocation(函式執行器)靈活的將目標函式以其它形式執行
如果都不中,呼叫doesnotrecognizeselector丟擲異常
iOS開發中runtime常用的幾種方法示例總結
前言 objective c runtime是乙個實現objective c語言的c庫。它是一門編譯型語言 也是一門動態型的語言 這裡強調下oc是靜態型別語言 之前沒接觸runtime的時候也不覺著它有多重要,接觸之後才發現其實runtime挺強大的。就拿我們在ios開發中所使用的oc程式語言來講,...
iOS開發中runtime的使用
事實證明 1.傳送訊息 implementation viewcontroller void viewdidload end implementation uiimage image 載入分類到記憶體的時候呼叫 void load 注意 不能在分類中重寫系統方法imagenamed,因為會把系統的功...
iOS開發中Runtime的實際應用
runtime是objective c的乙個固有特性,及在編譯階段並不能確定真正呼叫的函式名,函式的呼叫在執行時才得到確認。所以我們可以看到,oc在編譯階段沒有報錯的情況下,會在執行過程中出現閃退和崩潰的錯誤,而c語言在編譯過程中就會報錯。ios的錯誤處理 編譯未出報錯,執行卻閃退 動態呼叫特性 c...