NSTimeInterval始终为0

时间:2013-12-20 14:44:54

标签: ios objective-c nsdate nstimeinterval

对该主题做了一些研究,但仍然没有得到它。

使用[NSDate timeIntervalSinceDate:NSDate]时,NSTimeInterval始终为0。

实施例

- (NSNumber*) elapsed
    {
    __block NSDate* currentDate;
    dispatch_async(dispatch_get_main_queue(),
        ^{
        currentDate = [NSDate date];
        });
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt];
    _elapsed = @(timeInterval*1000);
    return _elapsed;
    }

您可以看到我在主队列中使用dispatch_async,因为从后台队列访问此getter属性并且[NSDate date]返回nil,这就是我想要解决此问题的方法。

然后你可以看到我正在寻找时间间隔并转换为两个日期之间的毫秒数。

编辑:使用此代码解决了时间间隔问题。

- (NSNumber*) elapsed
    {
    NSDate* currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt];
    NSLog(@"TimeInterval: %f", timeInterval);
    return @(timeInterval*1000);
    }

这实际上是对象中的getter,所以如果我将代码更改为

- (NSNumber*) elapsed
    {
    NSDate* currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt];
    NSLog(@"TimeInterval: %f", timeInterval);
    return _elapsed = @(timeInterval*1000);
    }

我得到EXC_BAD_ACCESS致命异常。

我想我从另一个后台队列中更改了创建该对象的队列时遇到了问题!

问候。

2 个答案:

答案 0 :(得分:3)

当您致电timeIntervalSinceDate时,currentDate未完成(尚未分配)。我想在这种情况下,编译器决定将它nil。在nil对象上调用方法(发送消息)总是返回0.

异步调度块会使块稍后执行,在这种情况下可能在方法返回后执行。在这种情况下,它可能会对内存执行一些非常糟糕的操作,因为它将分配给堆栈上的变量,该变量已经无效。

答案 1 :(得分:2)

所以问题是你的块在

之后被调用
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt];
_elapsed = @(timeInterval*1000);
return _elapsed;
}

当你使用dispatch_async时,代码会在下一个运行循环循环中被调用。尝试调试此方法以查看我的意思