2013-11-19 6 views
1

У меня возникли проблемы с NSTimer. Следующий код вызывается из метода и создает NSTimer и устанавливает его в переменную экземпляра self.syncDelay. Вызывается выражение if в конце метода, проверяющего, является ли таймер действительным.Сохранение сильной указатель на NSTimer не работает

Однако, когда я вызываю этот метод снова до истечения таймера, оператор if в верхней части метода не вызывается. Который, я предполагаю, поэтому [self.syncDelay invalidate]; не отменяет таймер.

У меня есть свойство, определенное как: @property (неатомный, сильный) NSTimer * syncDelay;

Функциональность, которую я ищу, - это таймер, который недействителен, когда метод вызывается во второй раз до истечения таймера и создания нового таймера. Таким образом, эффективно сброс таймера.

EDIT: Когда метод вызывается для второго, NSTimer равен нулю. Это странно, потому что я держу на нем сильный указатель.

else { 
    if ([self.syncDelay isValid]) { 
     NSLog(@"Timer valid at start of method"); 
    } 

    [self.syncDelay invalidate]; 

    self.syncDelay = nil; 

    NSInvocation *timerInvocation = [NSInvocation invocationWithMethodSignature: 
        [self methodSignatureForSelector:@selector(testMethod:)]]; 
    // configure invocation 
    [timerInvocation setSelector:@selector(testMethod:)]; 

    [timerInvocation setTarget:self]; 

    [timerInvocation setArgument:&className atIndex:2]; // argument indexing is offset by 2 hidden args 

    self.syncDelay = [NSTimer scheduledTimerWithTimeInterval:10 
              invocation:timerInvocation 
              repeats:NO]; 

    if ([self.syncDelay isValid]) { 
     NSLog(@"Timer valid at end of method"); 
    } 
} 
+0

Где еще используется таймер? Вы проверили, что метод вызывается, когда вы ожидаете (второй журнал печатается?)? – Wain

+0

Таймер больше не используется. Да, метод называется правильно. – pls

+1

Вы действительно вызываете метод на том же объекте? – Sulthan

ответ