在Objective-C中有一种方法可以获取方法调用的方法列表吗?

时间:2015-05-30 23:33:24

标签: objective-c objective-c-runtime

我一直在网上进行一些研究,发现使用Objective C中的ObjectiveC包你可以使用class_copyMethodList()得到一个类的所有方法的列表,我看到你可以得到使用IMP的方法的实现(instanceMethodForSelector:)。到目前为止,Apple文档here一直很有帮助,但我已经陷入困境,不确定我真正想要找到的内容。

我想要一个在给定方法的实现中调用的方法/函数的列表,这样我就可以构建一个调用树。

有什么建议吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

这个解决方案很难,并且会在每个方法中产生一行代码你也可以使用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

抱歉,对于双重答案,我删除了另一个,我不知道这是怎么发生的..

  

希望这对你有所帮助或至少给了你一个想法..快乐的编码,   干杯!

答案 1 :(得分:0)

我认为在运行时跟踪method是可能的,但function没有。

我已经构建了一个工具DaiMethodTracing,用于跟踪我所需要的单个类中的所有方法活动。这是基于Objective-c方法的混合。所以,有一个想法是这样做的

  1. 列出应用程序中的所有类。
  2. swizze每个班级的所有方法。
  3. 过滤您想要追踪的方法。
  4. 最后,您可能会获得method通话路径。