Я столкнулся с неловкой ситуацией, когда мне хотелось бы иметь класс с переменной экземпляра NSTimer, который многократно вызывает метод класса, пока класс жив. Для иллюстрации это может выглядеть так:
// .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, похоже, затруднит использование повторяющегося таймера в качестве ивара, потому что я не могу вспомнить время, когда ивару следует сохранять свой собственный класс.
Это оставляет мне неприятную обязанность придумать какой-то метод обеспечения интерфейса на MyClock, который позволяет пользователям класса контролировать, когда таймер запускается и останавливается. Помимо добавления ненужной сложности, это раздражает, потому что, если один владелец экземпляра класса делает недействительным, таймер может наступить на пальцы другого владельца, который рассчитывает на его продолжение. Я мог бы реализовать свою собственную систему псевдосохранения-счетчика для поддержания работы таймера, но ... серьезно? Это способ много работать для такой простой концепции.
Любое решение, которое я могу придумать, кажется хакерским. В итоге я написал оболочку для NSTimer, которая ведет себя точно так же, как обычный NSTimer, но не сохраняет свою цель. Мне это не нравится, и я был бы признателен за любые идеи.