拦截所有客观的c方法调用

拦截所有客观的c方法调用

问题描述:

我希望在我的iOS应用程序中调用方法时插入挂钩。因此,假设有一个选择器X,我希望在方法执行之前记录“方法X开始”,然后在执行后记录“方法X结束”。我知道一种方法,我可以在调用“自身”之前和之后调用sel X的实现,以便在方法执行时通知我。但是,如果我事先知道方法,这只会起作用。我希望为所有执行的方法插入钩子,即使我没有访问执行它的类的源代码(例如执行内部方法的第三方封闭库)。这背后的意图是记录在我的应用程序中执行每种方法所需的时间。我知道我不能重载objc消息发送方法调用来拦截方法。 NSObject是否有一些在方法执行前后调用的函数?拦截所有客观的c方法调用

+0

仪器有一个可能有用的时间分析仪器。 – Bamsworld

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

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

2-记录所有功能实际上是额外的代码在你的情况。额外的代码意味着应用程序的额外努力。你会做什么基本上会显着影响性能和电池使用情况。

3-苹果可以确保它的核心功能受到严重优化,花费了大量的时间在他们身上,以确保他们在他们的最好(在某些版本的Xcode它们被更新为好)

我的建议是记录你的功能,如果你想达到一个特定的目标。但通常不建议记录目标c。 PS:如果你想检查每个功能的时间,有些工具会告诉你哪些功能正在进行什么操作。

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

要回答你原来的问题,你实际上并不需要提前知道方法;您可以使用class_copyMethodList()来获取方法列表,然后遍历它们。尽管如此,我仍然不鼓励实际采用这种方式,因为乐器是这类产品的更好工具。