Richtige Weg zu lösen NSTimer?
Was ist der richtige Weg, um die Freigabe der NSTimer in meinem dealloc-Methode hinzu ? Es wurde mit dem folgenden code erstellt ?
-(void)mainTimerLoop {
mainTimer = [NSTimer scheduledTimerWithTimeInterval:1/10
target:self
selector:@selector(gameLoop)
userInfo:nil
repeats:YES];
}
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
haben Sie eine wirklich gute Antwort über NSTimer hier Wie verwende ich NSTimer? es, Sie sprechen darüber, stoppen einen sich wiederholenden NSTimer tun
Die Art und Weise Sie es tun, Sie werden nicht immer Treffer
dealloc
. Ein timer behält Ihr Ziel nicht. In diesem Fall, das heißt, der timer hat Sie beibehalten. Es wird dich nicht entlassen, bis es ungültig wird. Seit dem erstellen der timer, müssen Sie erlischt es irgendwann vordealloc
, weil der timer behalten die verhindert, dass Ihr Objekt wirddealloc
ed.Haben Sie zwei Möglichkeiten:
Als ein Beispiel für letzteres:
Bemerken, wie die Zeit Intervall ist
1.0/10.0
- dies könnte auch geschrieben werden0.1
, aber es nicht geschrieben werden1/10
, wie die division abgeschnitten wird, um0.0
.Beachten Sie auch, wie diese Pausen werden die retain-Zyklus:
Einen gültigen NSTimer ist beibehalten durch die Schlinge, die, wenn Sie es wiederholen, wird für immer oder bis Sie es ungültig ist. Sie sollten nicht zu veröffentlichen, da in deinem Beispiel-code, die Sie nicht explizit beibehalten werden. Wenn Sie ungültig sind, wird es nicht länger beibehalten werden, indem die Schlinge, und wird autoreleased.
Dies könnte in Ordnung sein für eine sich wiederholende timer, aber ist gefährlich für ein one-shot timer, da es am Ende vielleicht veröffentlicht wird, bevor Sie überhaupt auf ihn zugreifen, um zu sehen, wenn es gültig ist und/oder versuchen Sie es ungültig ist (das würde ein schlechtes-app-crash). Deshalb, wenn Sie planen, in irgendeiner Weise, dass das betrachten einer timer-variable nach der Erstellung (einschließlich zu prüfen, zu entkräften und/oder lösen), es könnte eine gute Praxis explizit zu behalten, es irgendwo in der app ein, und dann lassen Sie es und legen Sie es auf null, nachdem es ungültig ist und Sie fertig sind.
Lassen Sie es und legen Sie es auf null in einer Anweisung, wenn Sie deklarieren es als Eigentum behalten. Dann können Sie schreiben:
nil
ruft release auf es in objective-c?Brauchen Sie nicht zu lösen, weil es wird autoreleased. Alles entsteht durch eine convenience-Methode (D. H. Sie don ' T call
alloc
selbst) liegt in der Verantwortung der aufgerufenen Funktion, um Speicher zu verwalten, die in der Regel bedeutet, dass es callautorelease
auf das Objekt, das es schafft, bevor er es zurück.Ich würde weisen Sie den timer, um eine Eigenschaft mit der
retain
keyword obwohl, um sicherzustellen, dass es nicht freigegeben ist, auf Sie. In der Regel autoreleased-Objekte werden freigegeben, in der event-Schleife, die, wenn Sie nicht alle behält.