Невозможно аннулировать, остановить обратный отсчет NSTimer - Objective C

Проблема состоит в том, чтобы остановить NSTimer, по какой-то причине [Timer invalidate] просто не работает...

Возможно, мои глаза полны мыла, но не могут понять, почему таймер не остановился на 0, но перейдите в обратный счет -1, -2, -3 и так далее... (((

Я использую числа эпох как дату назначения. Еще одна вещь - моя кнопка "остановка IBAction" с [Timer invalidate] работает просто отлично - когда я нажимаю ее на таймер симулятора, останавливается...

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];


Timer = [NSTimer  scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];

}

- (IBAction) start {

Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];


}
- (IBAction) stop {

[Timer invalidate];
Timer = nil;

}

-(void)updateLabel {

NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
int units = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *components = [calender components:units fromDate:[NSDate date] toDate:destinationDate options:0];
[dateLabel setText:[NSString stringWithFormat:@"%d%c  %d%c  %d%c  %d%c", [components day], 'd', [components hour], 'h', [components minute], 'm', [components second], 's']];

destinationDate = [NSDate dateWithTimeIntervalSince1970:1355299710];

if (!destinationDate) {

    [Timer invalidate];
    Timer = nil;
}
}

Ответ 1

Как отметил Тотумус, ваше условие if statement !destinationDate всегда оценивается как false, поэтому ваш метод updateLabel никогда не отменяет ваш таймер.

У вас есть еще одна ошибка:

Вы создаете таймер в viewDidLoad и сохраняете ссылку на него в переменной экземпляра Timer.

Затем вы создаете еще один таймер в start и сохраняете ссылку на него в своей переменной экземпляра Timer, перезаписывая ссылку на таймер, созданный в viewDidLoad, без отмены этого более старого таймера.

Итак, теперь у вас есть два таймера, но у вас нет ссылки на старый таймер, поэтому вы никогда не можете его аннулировать.

Обратите внимание, что цикл выполнения имеет сильную ссылку на запланированный (рабочий) таймер, поэтому, даже если вы удалите все свои сильные ссылки на него, таймер продолжает работать. Вот почему существует сообщение invalidate: чтобы сообщить циклу запуска, чтобы удалить его сильную ссылку на таймер.