Frage

Am Ende der Entwicklung einer iPhone -Anwendung und ich frage mich, wie schlecht es ist, Autorelease bei der Entwicklung für das iPhone zu verwenden. Ich bin mit ein paar ziemlich zufälligen Abstürzen konfrontiert und kann es bisher nicht auf etwas anderes als schlampigen Speicherverbrauch bestimmen.

Als Kakao -Neuling erinnere ich mich, dass ich zunächst ein Richtliniendokument gelesen habe, das stark darauf hindeutet, dass Autorelease zugunsten der manuellen Rückhalte-/Veröffentlichung für das iPhone vermieden wurde. Ein "Senior" -Kakaoentwickler kam jedoch frühzeitig an Bord (der seitdem ironischerweise entlassen wurde), der überall Autorelease verwendete. Zugegeben, ich wurde in den Modus "Monkey See Monkey Do" gegangen, und es scheint zurückzukehren, um mich zu verfolgen (ich bin jetzt der einzige Entwickler des Projekts).

Also, was als nächstes zu tun ist? Es scheint mir, dass ich den Code verzweigen und versuchen muss, nach Möglichkeit den Autorelease -Code zu ersetzen und zu ersetzen, den ich den Daumen drücken kann, den ich nicht versehentlich die App brechen muss. Es scheint, dass viele Bibliotheksanrufe zu autoreleaseen Objekten wie StringwithFormat und so ziemlich alles führen, wo ich selbst nicht Alloc verwende. Irgendwelche anderen Gotchyas und/oder Vorschläge, nach denen ich achten sollte? Danke Kakao Gurus.

War es hilfreich?

Lösung

Die Verwendung von Release anstelle von Autorelease kann die Speicherverwendung an engen Stellen verbessern (was auf dem iPhone gut ist), wird jedoch überhaupt nicht helfen, wenn Sie die Regeln für Rückhalte- / Release -Regeln nicht folgen. Ich würde ein paar Tutorials zum Speichermanagement in OBJ-C lesen, wenn Sie noch ein wenig dunstig sind, was Sie tun sollten, und dann diese Abstürze mit den Debugger- und Crash-Berichten verfolgen . Dies und Dies sind zwei gute Orte, um anzufangen.

Andere Tipps

Wichtiger als die Auswahl von Autorelease oder Manual-Veröffentlichung ist, wie oft Sie alloc und dealloc dein NSAutoreleasePools. Da verwenden die meisten Kakao -Frameworks autorelease Großraums müssen Sie eine ordnungsgemäße Strategie des Poolentrainings haben. Sobald das vorhanden ist, die Wahl, ob es soll release oder autorelease wird viel weniger ein Problem.

Davon abgesehen sind die einzigen Bereiche, über die Sie sich Sorgen machen sollten NSAutoreleasePool Alle paar Iterationen für die besten Ergebnisse; Und wenn Sie einen anderen hervorgebracht haben NSThread Das hat keinen Runloop-schöpfen Sie einen Pool ab und lassen Sie ihn ab und zu im Leerlauf. Da die meisten Anwendungen nur eine kleine Datenmenge pro Ereignis zuweisen, UIKitDie Strategie, den Pool zuzuweisen, bevor das Ereignis versandt wird, und die Veröffentlichung nach dem Versandrenditen sehr gut funktioniert.

Wenn Sie der Meinung sind, dass Sie keine Autorelease verwenden, sehen Sie sich CS193P Herbst 2010 auf iTunes u -> Vorlesungsnummer 4 an.

Es lehrt Sie alle über Speichermanagement und so (wenn Sie die ersten 10 Minuten oder so überspringen)

Aus Gründen der iPhone -Leistungsgründe schlägt Apple vor, dass Sie nach Möglichkeit keine autoreleaseen Objekte verwenden sollten. Lassen Sie stattdessen Ihre Objekte explizit frei, wenn Sie mit ihnen fertig sind.

Wenn Sie Autorelease -Pools verwenden, können Sie möglicherweise einen ungenutzten Speicher herumliegen. Da das iPhone weniger Speicherplatz hat, können Sie die Leistung verbessern, wenn Sie den unnötigen Speicher so schnell wie möglich frei machen, anstatt es herumzulaufen, während es Ressourcen aufnimmt, während es auf eine Autorelease wartet.

Wenn Sie Autorelease haben, sagen Sie im Grunde: "Ich brauche das nicht länger, aber jeder andere kann es frei aufnehmen (bevor der automatische Release -Pool entwässert wird)." Wenn Sie ein Objekt, das Sie sagen, explizit weiterleiten: "Ich brauche das nicht länger und es sei denn, jemand anderes hat es etwas anderes gesagt (erworben), sollte es sofort behandelt werden."

Folglich ist Autorelease normalerweise nicht das Falsche. Es ist erforderlich, wenn Sie Objekte an den Absender einer Nachricht zurückgeben möchten, ohne dass der Absender die Veröffentlichung des Objekts erfordern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top