我想在屏幕上显示自某个事件以来经过的时间。我有一个成员变量
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];
它崩溃在这一行 - 我环顾四周,这似乎是正确的语法,这里发生了什么?
答案 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]将返回一个自动释放的对象。一旦超出范围,它将被解除分配。如果你想在你的'时钟'功能中使用它,你需要保留它。