2009-09-15 23 views

cevap

42

Öncelikle, zamanlayıcı

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

bunu iptal etmek istiyorum başka bir yerde kodunuzda Eğer bir işaretçi devam etmek istiyorum, sadece çağrı:

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

Should değil sıfırlamadan önce zamanlayıcıyı serbest bırakın? "geçersiz kılma", çalışma döngüsünün referansı serbest bırakmasına neden olur, ancak burada 'packetTimer' öğesine atandığında ek bir muhafaza vardır. –

+1

Bu doğru. Düzeltilmiş – coneybeare

+0

Hmm. Bu bana doğru görünmüyor. Sebatsien doğrudur - zamanlayıcıyı self.packetTimer öğesine atadığınızda (bir koruma özelliği olduğu varsayılırsa), bir tutma vardır. Runoop'a eklenmesi ikinci bir alıkoymadır. Daha sonra geçersiz hale getirdiğinizde, dahili bir sürüm var. Sanırım invalidate'den hemen sonra ve self.packetTimer öğesinin sıfırlanmadan hemen önce açık bir [self.packetTimer release] olması gerekiyor. Yanlış mıyım? – 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

Swift'de, elbette, autoTimer.invalidate() 've' null 'olarak ayarlanmaya gerek yoktur. – Joe

+0

Swift'de, onu sıfırlayacak olursanız, zamanlayıcı hala yanabilir. Bu bana oldu. – kkazakov

+0

INVALIDATE IT @ KOLAKOVA'YI DANIŞINIZ! –