不是调用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的更深处。