Я создаю NSTimer в методе createTimer
, к которому я хочу обратиться в более позднем методе cancelTimer
.Чтобы облегчить это, я вступаю во владение NSTimer через оставленное свойство, чтобы я мог вернуться к нему позже.Меня смущает проблема: если я запускаю таймер, отменяю его и запускаю снова, код вылетает.
@property(nonatomic, retain) NSTimer *walkTimer;
.
-(void)createTimer {
NSTimer *tempTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimerDisplay) userInfo:nil repeats:YES];
[self setWalkTimer:tempTimer];
}
-(void)cancelTimer {
[walkTimer release];
[[self walkTimer] invalidate];
}
Теперь, кажется, я это исправилизменив cancelTimer на:
-(void)cancelTimer {
[self setWalkTimer:nil];
[[self walkTimer] invalidate];
}
Мне просто любопытно, почему не работает релиз, мое понимание таково:
- NSTimer (объект автоматического выпуска, не принадлежащий мне)
- setWalkTimer (вступает во владение мной, retainCount + 1)
- выпуск (отказывается от владения, retainCount-1)
- аннулировать (позволяет системе избавляться от таймера)
РЕДАКТИРОВАТЬ:
// this fails ...
-(void)cancelTimer {
[[self walkTimer] invalidate];
[walkTimer release];
}
// this works fine ...
-(void)cancelTimer {
[[self walkTimer] invalidate];
[self setWalkTimer: nil];
}
РЕДАКТИРОВАТЬ: 002
Первоначально я думаю, что я перепутал
@property(nonatomic, retain) NSTimer *walkTimer;
// &
[self setWalkTimer];
и думая, что мне нужен релиз для балансировки свойства, я не перезаписываю его новым набором (либо другому объекту, либо nil) и, наконец, освобождаю свойство в dealloc.
Является лисобственность (сохранить) так же, как сохранить, я бы сказал нет, я думаю, что именно там я ошибался.
РЕДАКТИРОВАТЬ: 003 Что касается этого вопроса, я думаю, что я лично запутал вещи, неправильно используя [walkTimer release]
В результате тема перешла к принципиально новому вопросу, который я записал как это