2009-09-15 5 views

Odpowiedz

42

Najpierw chcesz zachować wskaźnik timera

self.packetTimer = [NSTimer timerWithTimeInterval:CONNECTION_TIMEOUT target:self selector:@selector(connectionTimeout:) userInfo:nil repeats:NO]; 
[[NSRunLoop currentRunLoop] addTimer:packetTimer forMode:NSDefaultRunLoopMode]; 

Jeśli gdzieś w kodzie chcesz ją anulować, wystarczy zadzwonić:

[self.packetTimer invalidate]; 
self.packetTimer = nil; 
+1

Gdyby nie ty zwolnić timer przed ustawieniem go na zero? "unieważnij" spowoduje, że pętla uruchamiająca zwolni jego odwołanie, ale istnieje dodatkowe zachowanie, gdy jest przypisane do 'packetTimer'. –

+1

To prawda. Poprawiono – coneybeare

+0

Hmm. To nie wygląda mi na poprawione. Sebatsien ma rację - jeśli przypiszesz timer do self.packetTimer (zakładając, że jest to właściwość retain), to jest zatrzymanie. Dodanie go do runloop jest drugim zachowaniem. Jeśli później go unieważnisz, pojawi się wewnętrznie. Myślę, że potrzebujesz jawnego [self.packetTimer release} zaraz po unieważnieniu i tuż przed ustawieniem self.packetTimer na zero. Czy się mylę? – Marc

101
@interface 
    NSTimer *autoTimer; 

@implementation 

// Start timer 
    autoTimer = [NSTimer scheduledTimerWithTimeInterval:(3.0) 
     target:self 
     selector:@selector(autoTimerFired:) 
     userInfo:nil 
     repeats:YES]; 

// Stop timer: 
    [autoTimer invalidate]; 
    autoTimer = nil; 
+20

W Swift, oczywiście, 'autoTimer.invalidate()' i nie ma potrzeby, aby ustawić na 'null'. – Joe

+0

W Swift, jeśli ustawisz go na zero, timer nadal może strzelać. To mi się przydarzyło. – kkazakov

+0

DLATEGO POWINIENEŚ "WYKONAWAĆ" IT @kkazakov! –