0

我有以下方法来更新显示简单时间的标签

-(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];
}

但是当我运行应用程序时,我遇到了一个错误的访问错误并且应用程序崩溃了,谁能帮我解决这个问题?

提前致谢

4

2 回答 2

5

你在用ARC吗?如果没有,_startTime = [NSDate date];这条线会导致你的问题。[NSDate date]返回一个自动释放对象,如果您不使用 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;
于 2013-03-04T22:59:39.673 回答
0

尝试添加异常断点以查看哪一行崩溃:

1)单击断点选项卡(右起第二个)...有点像向右箭头或“下一步”按钮

2) 点击标签菜单左下角的“+”

3)选择“添加异常断点”

4)(可选)选择“例外”下拉菜单并更改为“Objective-C”

5) 选择“完成”

6) 再次运行您的代码并尝试生成崩溃...当您这样做时,它有望被此断点捕获,您将看到哪一行正在崩溃并能够修复它

祝你好运

于 2013-03-04T22:49:15.683 回答