【问题标题】:How to NSLog calling function如何调用NSLog函数
【发布时间】:2011-09-14 03:45:27
【问题描述】:

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

我创建了一个类

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

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

然后做 [Tools computeTime:^{//operation}];

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

【问题讨论】:

    标签: objective-c xcode nslog


    【解决方案1】:

    两种选择:

    第一种是滥用+[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__)]
    

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

    【讨论】:

      【解决方案2】:

      对于搜索 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 中。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        • 2019-02-08
        相关资源
        最近更新 更多