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?".一个非常难以解决的职业问题.除非你想要"调试工具"成为你的职业,否则我建议不要走这条路.
你真的想回答什么问题?
怎么样这个:
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.