2008-12-15 13 views
12

Ich habe ein NSTimer Objekt, das ich ungültig machen muss, wenn ein Benutzer auf eine Schaltfläche klickt oder wenn sie eine Ansicht beenden. SoWie überprüft man, ob NSTimer bereits ungültig gemacht wurde

ich habe:

[myNSTimer invalidate]; 

in meinem Tastenhandler und innen viewWillDisappear. Wenn Benutzer auf eine Schaltfläche tippen und dann eine Ansicht vorhanden ist, löst die Anwendung eine Ausnahme aus, da myNSTimer bereits ungültig ist. Was ich in der viewWillDisappear Methode tun muss, ist zu überprüfen, ob die myNSTimer ungültig ist oder nicht. Wie mache ich das?

Ich habe versucht:

if(myNSTimer != nil) 
    [myNSTimer invalidate]; 

aber das hat nicht funktioniert.

Antwort

33

Sobald Sie den Timer ungültig gemacht haben, rufen Sie einfach release darauf an (vorausgesetzt, Sie haben die Referenz, an der Sie festgehalten haben, behalten) und dann Ihre Referenz aus. Wenn Sie auf diese Weise die Ansicht verlassen, wird der Versuch, den Timer ein zweites Mal ungültig zu machen, nur diese Methode auf Null setzen, was nichts tut.

Alternativ können Sie -[NSTimer isValid] verwenden, um vor dem Ungültigmachen zu prüfen, ob es gültig ist, aber es gibt wirklich keinen Grund, Ihre Referenz festzuhalten, nachdem Sie es beim ersten Mal ungültig gemacht haben. Auch, wenn Ihr wirkliches Problem ist, dass Sie Ihre Referenz nicht beibehalten haben und so die erste -invalidate tatsächlich Sie mit einem Verweis auf ein freigegebenes Objekt zeigt, dann wird das Aufrufen von -isValid sowieso nicht helfen.

+0

Vielen Dank für Ihre Antwort! –

+0

Das ist eine klare Erklärung. Vielen Dank! –

+0

Das war genau die Lösung für mein Problem "Nachricht gesendet zu deallocated Instanz". Vielen Dank. – High6

6

Was ich normalerweise tue, ist nil-out die Mitgliedsvariable, die den Timer hält, entweder wenn es feuert, oder wenn ich es annulliere. Dann können Sie einfach tun:

[myNSTimer invalidate]; 
myNSTimer = nil; 

und es wird das Richtige tun.

3

Ich hatte das gleiche Problem, während ich versuchte zu pausieren & einen Timer neu starten. Um ihn zu stoppen:

[timer invalidate]; 
[timer release]; 
timer = nil; 

Und starten/neu starten:

timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain]; 

Nun ist es nicht abstürzen, wenn ich es ungültig machen.

1

Swift:

if timer.valid { 
    timer.invalidate() 
} 
Verwandte Themen