Xcode / Objective-c - 如何以编程方式查找给定方法的调用者

时间:2015-07-21 10:33:39

标签: objective-c xcode

在xcode中,我可以使用图片中的按钮找到给定方法的调用者。

是否可以在运行时进行?

类似的东西:

-(NSArray *)getCallersOfFoo {

  // is it possible to find the callers of the method foo?

}

-(void)foo {...}

enter image description here

2 个答案:

答案 0 :(得分:1)

不完全是答案,但可能有所帮助。此方法将为您提供打印输出堆栈或调用区域中的调用方。您可以根据需要修改它们。

代码有点“被盗”,但我没有提到哪里。

#define SHOW_STACK NSLog(@"%@",[NSThread callStackSymbols])

#define SHOW_CALLER \
do {                \
NSArray *syms = [NSThread  callStackSymbols]; \
if ([syms count] > 1) { \
    NSLog(@"<%@ %p> %@ - caller: %@ ", [self class], self, NSStringFromSelector(_cmd),[syms objectAtIndex:1]); \
} else { \
    NSLog(@"<%@ %p> %@", [self class], self, NSStringFromSelector(_cmd)); \
} \
} while(0)
编辑:你可能想要这样的东西:

NSString *caller = nil;
NSArray *syms = [NSThread  callStackSymbols];

if (syms.count > 1)
{
    caller = syms[1];
}

if (caller.length)
{
    NSLog(@"%s called by %@",
          __PRETTY_FUNCTION__,
          caller);
}

您可能会发现another Q&A here on SO非常有用。

答案 1 :(得分:0)

答案简短:不。

答案很长:好吧,你可以搞乱调用堆栈,然后付出更多的努力来利用你得到的东西。但它很可能不是你正在寻找的东西。

通常,该方法不应该关注它的调用方式。