利用runtime追蹤物件的每乙個方法

2021-07-26 07:20:16 字數 971 閱讀 9531

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 ...