Objective c 如何记录调用函数

Objective c 如何记录调用函数,objective-c,xcode,nslog,Objective C,Xcode,Nslog,不是调用NSLog或Dlog的函数,而是调用该函数的函数 我创建了一个类 +(void) computeTime:(void (^)())block { NSDate * currentTime = [NSDate date]; block(); DLog ("Time Running is: %f", [[NSDate date] timeIntervalSinceDate:currentTime); } 所以每次有一个操作,我想测量它的时间,我会把它放在一个块中 和

不是调用NSLog或Dlog的函数,而是调用该函数的函数

我创建了一个类

+(void) computeTime:(void (^)())block
{
    NSDate * currentTime = [NSDate date];
    block();
    DLog ("Time Running is: %f", [[NSDate date] timeIntervalSinceDate:currentTime);
}
所以每次有一个操作,我想测量它的时间,我会把它放在一个块中

和do[Tools computeTime:^{//operation}]

但是,我想知道调用computeTime的函数。如何操作?

两个选项:

第一种方法是滥用
+[NSThread callStackSymbols]
来获取调用堆栈中所有符号的数组,并提取所需的符号。我怀疑这将是相对缓慢的

第二种是使用宏。C预处理器提供了一个名为
\uuuuu PRETTY\u FUNCTION\uuuu
的漂亮宏,其中包含了所有格式良好的函数名,它也适用于Obj-C方法。除了
[Tools computeTime:^{/*operation*/}]
之外,您还可以使用类似
[Tools computeTime with name:uu PRETTY_FUNCTION_uuublock:^{/*operation*/}]
的东西,或者您可以将其全部打包到自己的宏中,这样您就可以说
Tools\u COMPUTE\u TIME(^{/*operation*/})


注意,我使用了varargs风格的宏,因为C预处理器不太理解obj-C语法,所以块中的任何逗号都将被解释为宏的单独参数。如果我使用
TOOLS\u COMPUTE\u TIME(op)
定义它,那么编译器会抱怨宏只接受一个参数,但它被赋予了多个参数。通过使用varargs,编译器不在乎你给出了多少个参数,它会将它们全部传递到
\uuu VA\u ARGS\uuu
标记。

对于搜索OP原始问题并添加到Kevin的第一个使用调用堆栈的建议的人来说,这是另一个可能的答案

如果你正在寻找一个函数(方法),请考虑以下内容:

 NSArray *callStack = [NSThread callStackSymbols];
 // Top of the stack. Current method
 NSLog(@"Current method: %@", [callStack objectAtIndex:0]);
 // Called by
 NSLog(@"called by: %@", [callStack objectAtIndex:1]);
查找的堆栈项可能位于stackArray的更深处

希望这有助于更快地找到bug

 NSArray *callStack = [NSThread callStackSymbols];
 // Top of the stack. Current method
 NSLog(@"Current method: %@", [callStack objectAtIndex:0]);
 // Called by
 NSLog(@"called by: %@", [callStack objectAtIndex:1]);