如何找出谁叫方法?

Ano*_*ser 11 cocoa cocoa-touch objective-c

示例:当我的方法-fooBar被调用时,我希望它在控制台中登录其他类所谓的其他方法.

现在,我只知道如何记录fooBar本身的方法名称及其类,使用:

_cmd

[self class]
Run Code Online (Sandbox Code Playgroud)

这有可能搞清楚吗?

bbu*_*bum 35

在完全优化的代码中,没有100%可靠的方法来确定某个方法的调用者.编译器可以使用尾调用优化,而编译器有效地重新使用调用者的堆栈帧用于被调用者.

要查看此示例,请使用gdb在任何给定方法上设置断点,然后查看回溯.请注意,在每次方法调用之前都没有看到objc_msgSend().这是因为objc_msgSend()对每个方法的实现进行尾调用.

虽然您可以编译未优化的应用程序,但您需要所有系统库的非优化版本才能避免这一问题.

这只是一个问题; 实际上,你问"我如何重新发明CrashTracer或gdb?".一个非常难以解决的职业问题.除非你想要"调试工具"成为你的职业,否则我建议不要走这条路.

你真的想回答什么问题?

  • @alexgray怎么回答?答案是在问题的范围和规模上准确无误,并且鉴于接受和最终问题,希望能够使OP走上成功的道路. (8认同)
  • 这是一个反答案. (3认同)

Max*_*sca 6

怎么样这个:

NSString *sourceString = [[NSThread callStackSymbols] objectAtIndex:1];

NSCharacterSet *separatorSet = [NSCharacterSet characterSetWithCharactersInString:@" -[]+?.,"];
NSMutableArray *array = [NSMutableArray arrayWithArray:[sourceString  componentsSeparatedByCharactersInSet:separatorSet]];
[array removeObject:@""];

NSLog(@"Class caller = %@", [array objectAtIndex:3]);
NSLog(@"Method caller = %@", [array objectAtIndex:4]);
Run Code Online (Sandbox Code Playgroud)

致原作者,intropedro.

  • 这在完全优化的代码中不起作用,因为尾部调用优化使帧完全从堆栈中消失. (4认同)