Я столкнулся с неловкой ситуацией, когда хотел бы иметь класс с переменной экземпляра NSTimer, которая неоднократно вызывает метод класса, пока класс жив. В целях иллюстрации, он может выглядеть следующим образом:NSTimer как самонастраивающийся ivar
// .h
@interface MyClock : NSObject {
NSTimer* _myTimer;
}
- (void)timerTick;
@end
-
// .m
@implementation MyClock
- (id)init {
self = [super init];
if (self) {
_myTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerTick) userInfo:nil repeats:NO] retain];
}
return self;
}
- (void)dealloc {
[_myTimer invalidate];
[_myTImer release];
[super dealloc];
}
- (void)timerTick {
// Do something fantastic.
}
@end
Вот что я хочу. Я не хочу, чтобы выставлять интерфейс в моем классе для запуска и остановки внутреннего таймера, я просто хочу, чтобы он работал во время существования класса. Кажется достаточно простым.
Но проблема в том, что NSTimer сохраняет свою цель. Это означает, что до тех пор, пока этот таймер активен, он не позволяет классу освободиться от обычных методов управления памятью, поскольку таймер сохранил его. Не может быть и речи о ручном регулировании счета удержания. Такое поведение NSTimer, похоже, затрудняет когда-либо повторяющийся таймер как ivar, потому что я не могу думать о времени, когда ivar должен сохранить свой собственный класс.
Это оставляет мне неприятную обязанность придумать какой-то способ предоставления интерфейса в MyClock, который позволяет пользователям класса управлять, когда таймер запускается и останавливается. Помимо добавления ненужной сложности, это раздражает, потому что, если один владелец экземпляра класса делает недействительным таймер, он может наступить на носки другого владельца, который рассчитывает, что он будет продолжать работать. Я мог бы реализовать свою собственную систему псевдо-сохранения-счета для поддержания работы таймера, но ... серьезно? Это способ работать над такой простой концепцией.
Любое решение, которое я могу придумать, кажется хриплым. Я закончил писать обертку для NSTimer, которая ведет себя точно как обычный NSTimer, но не сохраняет свою цель. Мне это не нравится, и я был бы признателен за понимание.
это хорошо, тоже! – bbum
Это выглядит привлекательно. Полагаю, я должен был упомянуть, что я нацелен на iOS здесь, иначе, как упоминалось в bbum, я мог бы просто использовать GC и забыть этот беспорядок. В противном случае отличная ссылка =) –
А, ну. Не видел тег iOS, поэтому не предполагал. Приятно видеть, что вы нашли решение, которое вы можете использовать. –