2009-03-02 7 views
3

Ich gehe zurück über irgendeinen schlauen Code, um es aufzuräumen und ich sehe, dass ich NSTimers, die von scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: zurückgegeben wurden, beibehalte und sie in einem Feld ablege - dann lasse ich das Feld frei, wenn es feuert. In einigen Fällen verwende ich den Timer, um später eine Ungültigkeitsnachricht zu senden - aber in vielen Fällen nicht.Gibt es einen Grund, einen geplanten NSTimer beizubehalten, wenn Sie ihn nicht ungültig machen müssen?

Im neueren Code plane ich normalerweise nur den Timer und vergiss es. Ich verstehe, dass die Konstruktormethode Autoreleasing ist und der Zeitgeber von der Ausführungsschleife beibehalten wird, während es aktiv ist - damit sehe ich kein Problem.

Also, mein Verständnis abzurunden gerade aus - gibt es einen anderen Grund, warum ich meine Timer auf abhalten sollte, oder ist das, was ich jetzt das akzeptierte Idiom tue?

Dies ist alles im Zusammenhang mit iPhone-Code, aber ich glaube nicht, dass dies iPhone spezifisch ist.

Antwort

3

lasse ich nur die Laufschleife, um den Rückhaltegriff, ich - es ist die Laufschleife, die den Timer und nicht mir gehört. Wenn du verstehst was ich meine.

+0

Ja, das ist nicht wirklich eine Frage des Speichermanagements - obwohl ich das in meinen Text aufgenommen habe, für den Fall, dass ich etwas falsch verstanden hätte. Das heißt, wenn ich einen Hinweis darauf hätte, würde ich es trotzdem behalten - der Runloop sollte es freigeben, wenn es feuert. – philsquared

1

Ich beantworte meine eigene Frage.

Ich war meistens die Frage zu stellen, weil ich durch die Klassenreferenz docs gerade gewesen war und dieses Problem war nicht wirklich klar. Ich habe seitdem den Timer Programmierung Themen gelesen: Verwenden Timer Artikel im ADC und es deckt es ziemlich gut - vor allem der Abschnitt über die Speicherverwaltung am Ende.

Nach dem, was ich jetzt tue (nur planen, es sei denn, ich in der Lage sein müssen, nennen ungültig oder isValid usw.) ist der richtige Weg.

+0

Ich habe mir den Kopf geschlagen und versucht herauszufinden, warum mein Aufruf zum Invalidieren abstürzte! Ich habe den Timer NICHT behalten. Seltsames Verhalten ist allerdings, dass wenn Sie if (myTimer) {[myTimer invalidate];} verwenden, abstürzen werden, ohne dass der Timer beibehalten wird, also nicht verstehen, warum es durch die IF-Anweisung gekommen ist, aber dies scheint es gelöst zu haben! – jsherk

+0

Hier bezieht Beitrag: http://stackoverflow.com/questions/9399669/iphone-crash-message-sent-to-deallocated-instance – jsherk

+0

@jsherk - wenn Ihr nicht zurückgehaltener Timer freigegeben wird, bevor Sie, wenn Sie dann Ihre eigene Kopie der Zeiger wird immer noch einen Wert haben - er wird einfach nicht mehr auf ein zugewiesenes Objekt zeigen (oder zumindest nicht auf das, was du dachtest) - also ist ein Absturz genau das, was du außer Acht lässt (obwohl es schlimmer noch nicht abstürzen kann) !) – philsquared