Просто удалили мой предыдущий комментарий, потому что он имел идиотскую логическую ошибку, вот новая форма: вы правы, цикл сохранения не является проблемой, так как таймер должен быть аннулирован «внешне» в любом случае. Из старого комментария (хотя и не дословно): Конечно, после аннулирования таймера ссылка на него должна быть установлена на
даю 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]
В результате тема перешла к принципиально новому вопросу, который я записал какэто