objective-c提供了一種名為動態方法決議的手段,使得我們可以在執行時動態地為乙個selector提供實現。我們只要實現+resolveinstancemethod:和+resolveclassmethod:方法,並在其中為指定的selector提供實現即可(通過呼叫執行時函式class_addmethod來新增)。這連個方法都是nsobject中的類方法,其原型為:
+ (bool)resolveclassmethod:(sel)name;
+ (bool)resolveinstancemethod:(sel)name;
引數name是需要被冬天決議的selector;返回值文件中說是表示動態決議成功與否。但在上面的例子中(不涉及訊息**的情況下),如果在該函式內為指定的selector提供實現,無論返回yes還是no,編譯執行都是正確的;但如果在該函式內並不真正為selector提供實現,無論返回yes還是no,執行都會crash,道理很簡單,selector並沒有對應的而實現,而又沒有實現訊息**。resolveinstancemethod是為物件方法進行決議,而resolveclassmethod是為類方法進行決議。
@end
理解這段**:
1、首先判斷是否實現了resolveinstancemethod,如果沒有實現,返回null,進入下一步處理
2、如果實現了,呼叫resolveinstancemethod,獲取返回值
3、如果返回值為yes,表示resolveinstancemethod聲稱它已經提供了selector的實現,因此再次查詢method list,如果依然找到相應的imp,則返回該實現,否則提示警告資訊,返回null,進入下一步處理
4、如果返回值為no,返回null,進入下一步處理。
只有在resolveinstancemethod的實現中沒有真正為selector提供實現,並返回no的情況下才會進入訊息**流程;否則絕不會進入訊息**流程,程式要麼呼叫正確的動態方法,要麼crash。
OC 動態方法決議給乙個類新增類方法
bool resolveclassmethod sel sel bool resolveinstancemethod sel sel void cx clsmethod void cx instancemethod id obj,sel sel,nsstring objc 再給乙個類或者物件傳送訊息...
IOS 靜態方法與動態方法詳解
ios 靜態方法與動態方法詳解 1 問題提出 ios中有靜態方法與動態方法,那麼兩種方法的異同是什麼?2 問題分析 因為每個物件都由相應的資料結構與方法相構成,乙個程式可能有多個屬於同乙個類的物件,而每個物件的資料結構應該是不一的,但方法是相同的,若為每個物件開闢記憶體空間來儲存方法,必然是對記憶體...
ios中crash檢測方法
重點是dwarfdump uuid命令 我們在ios開發中會碰到的很多crash問題,如果debug除錯模式的話,我們可以往往很容易的根據log的輸出定位到導致crash的原因,但對於已經上線的應用,或者是release環境包導致的crash,我們就需要一些特殊的手段來通過crash log進行分析...