在 Objective-C 中有没有办法获取方法调用的方法列表?
Posted
技术标签:
【中文标题】在 Objective-C 中有没有办法获取方法调用的方法列表?【英文标题】:In Objective-C is there a way to get a list of the methods called by a method? 【发布时间】:2015-05-30 23:33:23 【问题描述】:我在网上做了一些研究,发现使用Objective C中的ObjectiveC
包可以得到一个使用class_copyMethodList()
的类上所有方法的列表,我看到你可以得到实现(@ 987654324@) 使用instanceMethodForSelector:
的方法。 Apple 文档 here 到目前为止一直很有帮助,但我被困住了,不确定我真正想要找到什么。
我想要一个在给定方法的实现中调用的方法/函数的列表,这样我就可以构建一个调用树。
有什么建议吗?提前致谢!
【问题讨论】:
运行时不能给你这个信息;运行时只知道方法的代码块开始的位置(地址)和有关该方法的元数据。如果要从现有的二进制代码构建调用树,则需要扫描指令流。可能有一种方法可以静态地从编译器中获取类似的东西——我不知道——或者肯定是从检测代码覆盖率向后工作。 【参考方案1】:这个方案比较难,每一个方法都会导致一行代码你也可以利用sqlite,保存跟踪的方法..
MethodTracker.h
@interface MethodTracker : NSObject
@property (nonatomic) NSMutableArray *methodTrackArr;
+ (MethodTracker *)sharedVariables;
@end
MethodTracker.m
@implementation MethodTracker
static id _instance = nil;
+ (MethodTracker *)sharedVariables
if (!_instance)
_instance = [[super allocWithZone:nil] init];
return _instance;
// optional
- (void)addMethod:(NSString *)stringedMethod
// or maybe filter by: -containObject to avoid reoccurance
[self.methodTrackArr addObject:stringedMethod];
NSLog("current called methods: %@", methodTrackArr);
@end
并像这样使用它:
OtherClass.m
- (void)voidDidLoad
[super viewDidLoad];
[[MethodTracker sharedVariables] addMethod:[NSString stringWithUTF8String:__FUNCTION__]];
// or directly
[[MethodTracker sharedVariables].methodTrackArr addObject:[NSString stringWithUTF8String:__FUNCTION__]];
- (void)someOtherMethod
// and you need to add this in every method you have (-_-)..
[[MethodTracker sharedVariables] addMethod:[NSString stringWithUTF8String:__FUNCTION__]];
我建议你将 MethodTracker.h
导入到 [ProjectName]-Prefix.pch
文件中。
对不起,对于双重答案,我删除了另一个,我不知道这是怎么发生的..
希望这对您有所帮助,或者至少给了您一个想法。祝您编码愉快, 干杯!
【讨论】:
【参考方案2】:我认为在运行时轨道method
是可能的,但function
不是。
我已经构建了一个工具DaiMethodTracing 用于跟踪单个类中的所有方法活动以满足我的一些需要。这是基于objective-c方法调配。所以,有一个想法来做到这一点
-
列出应用程序中的所有类。
调整每个类中的所有方法。
过滤您要跟踪的方法。
最后,你可能会得到method
调用路径。
【讨论】:
感谢您的建议!不过,我宁愿不必在项目内部执行此操作。我真的更希望有一个独立的工具,我可以在现有项目上运行而无需对其进行修改。以上是关于在 Objective-C 中有没有办法获取方法调用的方法列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Objective-C 从 iOS 上的 iBeacon 数据包中获取信号强度值