NSDate:timeIntervalSinceNow崩溃

时间:2012-01-24 21:15:59

标签: iphone objective-c nsdate

我想在屏幕上显示自某个事件以来经过的时间。我有一个成员变量

NSDate *_startTime;

我分配它(并启动一个计时器),如下所示:

_startTime = [NSDate date];
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(clock) userInfo:nil repeats:YES];

我的时钟功能被称为罚款,但当我试图找到经过的时间时,我发现了一个没有真正确定结果的真正方法的崩溃;我很简单得到EXC_BAD_ACCESS。下面是我尝试获取引发异常的_startDate以来经过的时间:

NSTimeInterval secondsElapsed = [_startTime timeIntervalSinceNow];

它崩溃在这一行 - 我环顾四周,这似乎是正确的语法,这里发生了什么?

4 个答案:

答案 0 :(得分:2)

您可能需要retain _startTime,否则会自动释放。 (当然,一旦你保留它,你有责任稍后发布它。)

答案 1 :(得分:2)

除非您使用ARC,否则您需要拥有NSDate中存储的_startTime对象的所有权。 +[NSDate date]会返回您不拥有的对象,并且可能已被解除分配,因此在您发送timeIntervalSinceNow时无效。

您可以像这样创建一个拥有的NSDate

// By default, NSDates are initialized with the current date
_startTime = [[NSDate alloc] init];

或明确取得+date的返回值的所有权:

_startTime = [[NSDate date] retain];

它们实际上是等效的。

更好(假设你有一个为_startTime定义的属性(你应该))将使用setter:

[self setStartTime:[NSDate date]];

将属性定义为retain,这将正确处理内存。

答案 2 :(得分:0)

您没有保留_startTime,因此可能会在您的计时器触发时解除分配。

答案 3 :(得分:0)

[NSDate date]将返回一个自动释放的对象。一旦超出范围,它将被解除分配。如果你想在你的'时钟'功能中使用它,你需要保留它。