如何NSLog调用功能

时间:2011-09-14 03:45:28

标签: objective-c xcode nslog

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

我创建了一个类

+(void) computeTime:(void (^)())block
{
    NSDate * currentTime = [NSDate date];
    block();
    DLog ("Time Running is: %f", [[NSDate date] timeIntervalSinceDate:currentTime);
}

因此,每当有一个操作我想测量它的时间时,我会把它放在一个块中。

并执行[Tools computeTime:^ {// operation}];

但是,我想知道调用computeTime的函数。我该怎么做?

2 个答案:

答案 0 :(得分:7)

两个选项:

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

第二种是使用宏。 C预处理器提供了一个名为__PRETTY_FUNCTION__的漂亮宏,它包含所有格式良好的函数名称,并且它也适用于Obj-C方法。您可以使用[Tools computeTime:^{/*operation*/}]之类的内容代替[Tools computeTimeWithName:__PRETTY_FUNCTION__ block:^{/*operation*/}],也可以将其全部包装在自己的宏中,这样您就可以说TOOLS_COMPUTE_TIME(^{/*operation*/})

#define TOOLS_COMPUTE_TIME(...) [Tools computeTimeWithName:__PRETTY_FUNCTION__ block:(__VA_ARGS__)]

注意,我使用了varargs样式的宏,因为C预处理器不能很好地理解obj-c语法,所以块中的任何逗号都将被解释为宏的独立参数。如果我使用TOOLS_COMPUTE_TIME(op)定义它,那么编译器会抱怨宏只接受1个参数,但它被赋予多个。通过使用varargs,编译器不关心你给它多少个参数,它会将它们全部传递给__VA_ARGS__标记。

答案 1 :(得分:7)

另一个可能的答案是有人搜索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。

希望这有助于更快地找到错误。