Objective c 如何记录调用函数
不是调用NSLog或Dlog的函数,而是调用该函数的函数 我创建了一个类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); } 所以每次有一个操作,我想测量它的时间,我会把它放在一个块中 和
+(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]);