Я подумал, что я бы сказал, что это отдельный вопрос из моего предыдущего retaining-repeating-nstimer-for-later-access, поскольку обсуждение продвинулось вперед, сделав новый вопрос более ясным, чем еще один EDIT:
Сценарий - это объект, который создает повторяющийся NSTimer, скажем, в viewDidLoad, после создания NSTimer необходимо остановиться, чтобы к нему могли обращаться другие методы.
NSTimer *ti = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(updateDisplay:)
userInfo:nil
repeats:YES];
Я понимаю, что при создании runloop становится владельцем NSTimer и в конечном итоге останавливается, удаляет и освобождает NSTimer при вызове [ti invalidate];
.
В силу того, что нам нужно получить доступ к NSTimer более чем в одном методе, нам нужно каким-то образом сохранить ссылку для использования в будущем, пересмотренный вопрос:
// (1) Should the NSTimer be held using an owning reference (i.e.)
@property(nonatomic, retain) NSTimer *walkTimer;
[self setWalkTimer: ti];
...
...
// Cancel method
[[self walkTimer] invalidate;
[self setWalkTimer:nil];
...
...
// dealloc method
[walkTimer release];
[super dealloc];
.
// (2) Should the NSTimer be held using a weak reference (i.e.)
@property(nonatomic, assign) NSTimer *walkTimer;
[self setWalkTimer: ti];
...
...
// Cancel method
[[self walkTimer] invalidate];
[self setWalkTimer:nil];
...
...
// dealloc method
[super dealloc];
.
// (3) Use an iVar and rely on the runLoop holding (i.e. retaining) the timer
NSTimer *walkTimer;
NSTimer *walkTimer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(updateDisplay:)
userInfo:nil
repeats:YES];
...
...
// Cancel method
[walkTimer invalidate];
walkTimer = nil;
.
// (4) Something not listed above ...
Я рад за просто (1) (2) (3) или (4), поскольку много обсуждений, которые лучше всего написаны на Other поток. Кажется, что есть много противоречивых ответов, поэтому я надеюсь, что этот более конкретный вопрос поможет сосредоточиться на том, что может быть лучшей практикой в этой ситуации.
EDIT:
В качестве дополнительной заметки в Ссылка на класс Apple NSTimer 4 из 5 примеров проектов кода используют NSTimers, которые назначаются ** на сохраняемое имущество. Вот пример того, что показывают ссылочные примеры классов:
@property (nonatomic, retain) NSTimer *updateTimer;
updateTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateCurrentTime) userInfo:p repeats:YES];
...
...
// Cancel
[updateTimer invalidate];
updateTimer = nil;
...
...
// Dealloc method
[super dealloc];
[updateTimer release];
** Следует отметить, что в примерах Apple назначают iVar напрямую и не используют средство настройки свойств.