拦截所有客观c方法调用

时间:2017-08-15 13:52:59

标签: ios objective-c selector objective-c-runtime dispatch

我想在我的iOS应用程序中调用方法时插入钩子。所以假设有一个选择器X,我希望在方法执行之前记录“方法X启动”,然后在执行后记录“方法X结束”。我知道一种方法,我可以调用sel X的实现与在“自身”调用之前和之后有钩子的实现,这样我可以在方法执行时得到通知。但是,只有事先了解方法,这才有效。我希望为所有执行的方法插入钩子,即使我无法访问执行它的类的源代码(例如第三方关闭库执行内部方法)。这背后的意图是记录在我的应用程序中执行每个方法所花费的时间。我知道我无法覆盖objc消息发送方法调用拦截方法。 NSObject是否有一些在执行方法之前和之后调用的函数?

2 个答案:

答案 0 :(得分:3)

听起来你真正想要的是在Instruments的“Time Profiler”工具中运行你的应用程序。这将记录您的所有方法调用,并向您显示哪些方法在您的应用中花费的时间最长。

要回答你原来的问题,你实际上不必提前知道这些方法;你可以使用class_copyMethodList()来获取方法列表,然后迭代它们。但是,我不鼓励实际走这条路,因为仪器是这类事情的更好工具。

答案 1 :(得分:1)

相信我你不想要这个。正如你在更高层次上所认为的那样调用一个函数并记录它的开始和结束是好的,由于以下原因它对你没有任何好处:

1-函数将调用许多低级函数:addSubview本身将单独调用许多函数,并且它调用的函数也将调用许多函数。您认为您将要调用1个函数,但在这种情况下,此日志将被触发+20次。

2-记录所有函数实际上是您的案例中的额外代码。额外的代码意味着额外的努力应用程序。您将要做的是显着影响性能和电池使用率。

3- Apple确保其核心功能得到认真优化,并花费大量时间来确保它们处于最佳状态(在某些xCode版本中也会更新)

如果您正在努力实现特定目标,我的建议是记录您的功能。但一般不建议采用目标c。

PS:如果您正在尝试检查每个功能的时间,有一些工具可以显示哪些功能正在运行。