Has*_*ood 0 iphone exc-bad-access nstimer ios
我有以下方法来更新显示简单时间的标签
-(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;
}
Run Code Online (Sandbox Code Playgroud)
然后我将其称为按钮操作:
-(IBAction) startTimer{
_startTime = [NSDate date];
_walkRouteTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimeLabel:) userInfo:nil repeats:YES];
[_walkRouteTimer fire];
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行应用程序时,我得到一个错误的访问错误,应用程序崩溃,任何人都可以帮我这个吗?
提前致谢
你在用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];
}
Run Code Online (Sandbox Code Playgroud)
当你完成计时后,在打电话后[_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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1788 次 |
| 最近记录: |