如何实现NSLog调用功能



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

我创建了一个类
+(void) computeTime:(void (^)())block
{
    NSDate * currentTime = [NSDate date];
    block();
    DLog ("Time Running is: %f", [[NSDate date] timeIntervalSinceDate:currentTime);
}

所以每次我想测量一个操作的时间时,我就把它放在一个块中

and do [Tools computeTime:^{//operation}];

然而,我想知道调用computeTime的函数。我该怎么做呢?

两个选项:

第一个是滥用+[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个参数,但它被赋予了多个。通过使用可变参数,编译器不会关心你给它多少个参数,它会把它们全部传递给__VA_ARGS__标记。

对于搜索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的更深处。

最新更新