void qhd_exchangeinstancemethod(class
class, sel
originalselector, sel
newselector) else
}@implementation
uiviewcontroller (test)
+ (void)load
//[mobclick
beginlogpageview:
self.title];
[self
} //[mobclick
endlogpageview:
self.title];
[self
}@end
最近產生了乙個的想法:替換乙個類的所有方法,每乙個方法都列印乙個log,看看呼叫順序是怎樣的,例如我想知道uiviewcontroller在執行時到底都呼叫了哪些方法,包括私有方法。
思路是這樣的:
1.通過class_copymethodlist得出乙個類的所有方法。
2.通過method_gettypeencoding和method_copyreturntype得出方法的引數型別和返回值。
3.建立出sel和imp,通過class_addmethod動態新增新方法。
4.通過交換的思想,在新方法裡通過nsinvocation來呼叫原方法。
難點在於,新方法裡面怎麼把方法的「實現」(即imp)繫結上,並且在「實現」裡呼叫原方法。在runtime的標頭檔案中method的結構:
typedef struct objc_method *method;
struct objc_method
可以看到method包含了是三個元素:乙個sel,乙個char *,乙個imp。
sel是方法名,char *是方法的型別,imp就是實現的位址。
具體**檢視github:
利用runtime動態生成物件?
利用runtime我們能夠動態生成物件 屬性 方法這特性 假定我們要動態生成dyviewcontroller,並為它建立屬性propertyname 1 物件名 nsstring class dyviewcontroller const char classname class cstringusi...
iOS 物件的歸檔 解檔 runtime
ios 物件的歸檔 解檔 runtime 若要例項物件實現歸檔解檔,需要該類遵守nscoding協議,及以下協議方法 專案中以ycarchivebase類為例,可直接新增屬性使用 歸檔和接檔的操作以類方法實現如下 可自己建立管理類分離出去 archivefilepath 為檔案儲存路徑 void a...
OC 的 Runtime 動態獲取物件屬性
執行時是 oc 的核心,其特點就是程式在執行的時候,以傳送訊息的形式呼叫方法.在實際開發中,關於執行時方面的運用點,其實並不多,最常用的也無非是動態獲取物件的屬性.示例 1.新建乙個繼承自nsobject 的物件,在.h 檔案宣告2個屬性 import inte ceperson nsobject ...