在 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 数据包中获取信号强度值

选择 *.jpg 文件 Objective-C

C# 中有没有办法在不使调用者也异步的情况下调用异步方法? [复制]

在代码中获取调用者函数的名字

在Objective-C中搜索和获取多维数组的索引

Objective-C 有没有办法判断一个对象是不是设置为自动释放?