Просто удалили мой предыдущий комментарий, потому что он имел идиотскую логическую ошибку, вот новая форма: вы правы, цикл сохранения не является проблемой, так как таймер должен быть аннулирован «внешне» в любом случае. Из старого комментария (хотя и не дословно): Конечно, после аннулирования таймера ссылка на него должна быть установлена ​​на

даю 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] В результате тема перешла к принципиально новому вопросу, который я записал какэто

Ответы на вопрос(3)

Ваш ответ на вопрос