2010-11-22 13 views
0

Wie kann ich NSTimer in RunTime stoppen?NSTimer in der Laufzeit gestoppt?

Ich verwende den folgenden Code .aber NSTimer läuft immer wieder (ich will NSTimer wiederholen, ich in Runtime beenden möchten)

- (void)TimerCallback 
    { 

    ..... 
    [self.tim invalidate]; 
     self.tim = nil; 

} 


-(void)timerStart 
{ 


    self.tim = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(TimerCallback) userInfo:nil repeats:YES]; 

} 
+0

versuche ich denke, Sie tun es richtig, nicht sicher, warum NSTimer nicht nach Ungültigkeitsmitteilung stoppt .. Ist ‚tim‘ gesetzt zu behalten? oder kopieren? beim Deklarieren der Eigenschaft – Sanniv

+0

habe ich als beibehalten in property..I muss Kopie zuweisen? –

Antwort

2
  1. Es wiederholt ist. NEIN, wenn Sie will es nur einmal laufen lassen. Sie haben wiederholt: JA.

  2. Es ist [tim invalidate] und nicht self.tim ungültig

  3. Sie nicht do self.tim = nil, denn das ist es freigibt. Ungültig macht alles.

  4. Für die Aufzeichnung, stellen Sie sicher, dass Ihre Eigenschaft korrekt ist, dh
    @property (nicht atomare, behalten) NSTimer * happyTimer;
    und
    @synthesize happyTimer;

  5. Für den Datensatz müssen Sie auf demselben Thread sein.

Ich hoffe, es hilft. Hier

ist alle Codezeilen Schnitt von einem Arbeitsherstellungsbeispiel:

NSTimer *ttt; 
@property (nonatomic, retain) NSTimer *ttt; 
@synthesize ttt; 
self.ttt = [NSTimer scheduledTimerWithTimeInterval:7.00 
    target:self selector:@selector(ringBell) userInfo:nil repeats:YES]; 
if ([ttt isValid]) 
    [ttt invalidate]; 
[ttt release]; // in dealloc 

Sie müssen einige Debug-Linien NSLog hinzufügen (@ „Ich habe gerade für ungültig erklärt“); und so weiter, um sicherzustellen, dass du keinen Grundfehler hast.

+0

hi, ich möchte Wiederholungen: JA ... Ich folgte der Anweisung, die Sie gesagt haben, aber der Timer läuft noch ... –

+0

Über Punkt 2; beide machen das Gleiche. Über Punkt 3; self.tim weist den Timer auf null zu. Wenn es (retain) den Speicher freigibt, ist es bereits freigegeben, wenn es zugewiesen ist. In beiden Fällen ist es in Ordnung. – seppo0010

0

Ihr Code scheint korrekt zu sein. Normalerweise startet dieses Problem den doppelten Timer. Sie können



-(void)timerStart { 
    [self.tim invalidate]; 
    self.tim = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(TimerCallback) userInfo:nil repeats:YES]; 

}