2017-08-15 124 views
0

我希望在我的iOS應用程序中調用方法時插入掛鉤。因此,假設有一個選擇器X,我希望在方法執行之前記錄「方法X開始」,然後在執行後記錄「方法X結束」。我知道一種方法,我可以在調用「自身」之前和之後調用sel X的實現,以便在方法執行時通知我。但是,如果我事先知道方法,這隻會起作用。我希望爲所有執行的方法插入鉤子,即使我沒有訪問執行它的類的源代碼(例如執行內部方法的第三方封閉庫)。這背後的意圖是記錄在我的應用程序中執行每種方法所需的時間。我知道我不能重載objc消息發送方法調用來攔截方法。 NSObject是否有一些在方法執行前後調用的函數?攔截所有客觀的c方法調用

+0

儀器有一個可能有用的時間分析儀器。 – Bamsworld

回答

1

相信我你不想要這個。正如你認爲在更高的層次上調用函數並記錄開始和結束是好的,由於以下原因,它不會有任何好處:

1-函數將調用許多許多較低級別的函數: addSubview本身會單獨調用很多函數,它調用的函數也會調用其中的許多函數。您認爲您即將調用1個函數,但在這種情況下,此日誌將被觸發+20次。

2-記錄所有功能實際上是額外的代碼在你的情況。額外的代碼意味着應用程序的額外努力。你會做什麼基本上會顯着影響性能和電池使用情況。

3-蘋果可以確保它的核心功能受到嚴重優化,花費了大量的時間在他們身上,以確保他們在他們的最好(在某些版本的Xcode它們被更新爲好)

我的建議是記錄你的功能,如果你想達到一個特定的目標。但通常不建議記錄目標c。 PS:如果你想檢查每個功能的時間,有些工具會告訴你哪些功能正在進行什麼操作。

3

聽起來像你真正想要的是在樂器的「Time Profiler」工具中運行你的應用程序。這會記錄所有的方法調用,並顯示哪些應用程序在您的應用程序中花費的時間最長。

要回答你原來的問題,你實際上並不需要提前知道方法;您可以使用class_copyMethodList()來獲取方法列表,然後遍歷它們。儘管如此,我仍然不鼓勵實際採用這種方式,因爲樂器是這類產品的更好工具。