NSTimer崩溃,访问不好

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

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

然后我把它作为一个button的动作:

 -(IBAction) startTimer{ _startTime = [NSDate date]; _walkRouteTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimeLabel:) userInfo:nil repeats:YES]; [_walkRouteTimer fire]; } 

但是当我运行应用程序,我得到一个错误的访问错误和应用程序崩溃,任何人都可以帮助我呢?

提前致谢

你使用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; 

尝试添加一个exception断点来查看哪一行崩溃:

1)点击断点选项卡(右边第二个)…有点看起来像一个正确的箭头或“下一步”button

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

3)select“添加exception断点”

4)(可选)select“exception”下拉菜单并切换到“Objective-C”

5)select“完成”

6)再次运行你的代码,并尝试产生崩溃…当你这样做,它将有希望被这个断点抓住,你会看到哪一行崩溃,并能够修复它

祝你好运