我有以下方法来更新显示简单时间的标签
-(void)updateTimeLabel:(NSTimer *)timer{
NSInteger secondsSinceStart = (NSInteger)[[NSDate date] timeIntervalSinceDate:_startTime];
NSInteger seconds = secondsSinceStart % 60;
NSInteger minutes = (secondsSinceStart / 60) % 60;
NSInteger hours = secondsSinceStart / (60 * 60);
NSString *result = nil;
if (hours > 0) {
result = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];
}
else {
result = [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
}
_totalTime = result;
_totalTimeLabel.text = result;
}
然后我将其称为按钮操作:
-(IBAction) startTimer{
_startTime = [NSDate date];
_walkRouteTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimeLabel:) userInfo:nil repeats:YES];
[_walkRouteTimer fire];
}
但是当我运行应用程序时出现错误的访问错误并且应用程序崩溃,有人可以帮我这个吗?
提前致谢
答案 0 :(得分:5)
你在使用ARC吗?如果没有,_startTime = [NSDate date];
此行会导致您的问题。 [NSDate date]
返回了一个autorelease对象,如果您没有使用ARC(或使用ARC但声明_startTime为弱),_startTime将不会保留它。
如果是,请尝试添加保留
-(IBAction) startTimer{
//_startTime = [NSDate date]
_startTime = [[NSDate date] retain];
_walkRouteTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimeLabel:) userInfo:nil repeats:YES];
[_walkRouteTimer fire];
}
当您完成计时后,在致电[_walkRouteTimer invalidate]
后,请致电[_startTime release]
。
甚至更简单,如果您使用startTime
的属性并将其声明为保留。只需使用点符号:
-(IBAction) startTimer{
//_startTime = [NSDate date]
self.startTime = [NSDate date];
_walkRouteTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimeLabel:) userInfo:nil repeats:YES];
[_walkRouteTimer fire];
}
...
//After [_walkRouteTimer invalidate]
self.startTime = nil;
答案 1 :(得分:0)
尝试添加异常断点以查看哪条线路崩溃:
1)点击断点选项卡(右起第二个)...有点像右箭头或“下一步”按钮
2)单击选项卡菜单左下角的“+”
3)选择“添加例外断点”
4)(可选)选择“Exception”下拉菜单并切换到“Objective-C”
5)选择“完成”
6)再次运行您的代码并尝试生成崩溃...当您这样做时,它有望被此断点捕获,您将看到哪条线崩溃并能够修复它
祝你好运