2 Stimmen

Autorelease iPhone

Ich nähere mich dem Ende der Entwicklung einer iPhone-Anwendung und frage mich, wie schlecht es ist, Autorelease bei der Entwicklung für das iPhone zu verwenden. Ich bin mit einigen ziemlich zufällige Abstürze konfrontiert und bisher kann ich es nicht auf etwas anderes als schlampige Speichernutzung zu lokalisieren.

Als Cocoa-Neuling erinnere ich mich, dass ich anfangs ein Leitliniendokument gelesen habe, in dem dringend empfohlen wurde, Autorelease zugunsten von manuellem Retain/Release für das iPhone zu vermeiden. Allerdings kam schon früh ein "erfahrener" Cocoa-Entwickler an Bord (der ironischerweise seitdem entlassen wurde), der überall Autorelease verwendete. Ich gebe zu, dass ich in den "Affe sieht Affe"-Modus übergegangen bin, und das scheint mich jetzt zu verfolgen (ich bin jetzt der einzige Entwickler in diesem Projekt).

Was ist also als nächstes zu tun? Es scheint mir, dass ich den Code verzweigen und versuchen, durchzugehen und zu ersetzen, wo möglich, Autorelease-Code halten meine Finger gedrückt, dass ich nicht versehentlich brechen die App. Es scheint, dass viele Bibliotheksaufrufe zu automatisch freigegebenen Objekten wie stringWithFormat und so ziemlich alles, was ich nicht selbst verwende, führen. Alle anderen gotchyas und / oder Vorschläge, die ich sollte für suchen? Danke Cocoa-Gurus.

12voto

Marc Charbonneau Punkte 40221

Die Verwendung von Release anstelle von Autorelease kann die Speichernutzung an engen Stellen verbessern (was auf dem iPhone gut ist), aber es hilft nicht bei Abstürzen, wenn Sie die Regeln für Retain / Release nicht befolgen. Ich würde ein paar Tutorials über die Speicherverwaltung in Obj-C lesen, wenn Sie immer noch ein wenig unklar sind, was Sie tun sollten, und dann nach diesen Abstürzen mit dem Debugger und Absturzberichte zu gehen, um herauszufinden, wo Sie über die Freigabe von Objekten sind. Diese y este sind zwei gute Ausgangspunkte.

0 Stimmen

"Diese" Links sind tot.

4voto

rpetrich Punkte 32030

Wichtiger als die Wahl zwischen automatischer oder manueller Entriegelung ist, wie oft Sie alloc y dealloc Ihr NSAutoreleasePool s. Da die meisten Cocoa-Frameworks die autorelease müssen Sie eine geeignete Strategie für die Entleerung des Schwimmbeckens haben. Sobald dies der Fall ist, können Sie entscheiden, ob Sie release o autorelease ist viel weniger ein Problem.

Die einzigen Bereiche, über die Sie sich Sorgen machen sollten, sind enge Schleifen - Zuweisen und Freigeben einer NSAutoreleasePool alle paar Iterationen, um beste Ergebnisse zu erzielen; und wenn Sie einen weiteren Laichvorgang durchgeführt haben NSThread der keinen Runloop hat - einen Pool anlegen und ihn ab und zu leeren, wird untätig. Da die meisten Anwendungen nur eine kleine Menge an Daten pro Ereignis zuweisen, UIKit Die Strategie, den Pool vor dem Versand des Ereignisses zuzuweisen und ihn nach der Rückkehr des Versandes wieder freizugeben, funktioniert sehr gut.

2voto

taevanbat Punkte 425

Wenn du glaubst, dass du nicht weißt, wie man Autorelease verwendet, schau dir CS193p FALL 2010 auf iTunes U -> Vorlesung Nummer 4 an.

Hier lernt man alles über Speicherverwaltung und so (wenn man die ersten 10 Minuten oder so überspringt)

0voto

August Punkte 12061

Aus Gründen der iPhone-Leistung empfiehlt Apple, wann immer möglich, keine automatisch freigegebenen Objekte zu verwenden. Geben Sie stattdessen Ihre Objekte explizit frei, wenn Sie mit ihnen fertig sind.

0 Stimmen

Ich habe keine Referenz. Dies war etwas, das in einem ihrer Tech Talks vorgeschlagen wurde. Wenn Sie ein Objekt automatisch freigeben, bleibt es für eine beliebige Zeitspanne erhalten, bis das System es zerstören kann. Das bedeutet, dass es zwar "weg" ist, aber immer noch Ressourcen verbraucht - etwas sehr Wertvolles auf dem iPhone. Wenn Sie Objekte explizit freigeben, erhalten Sie diese Ressourcen sofort zurück.

0 Stimmen

Schauen Sie in das folgende Dokument Richtlinien für Speichernutzung und Leistung Suche nach "Ungenutzten Speicher freigeben"

0voto

has Punkte 1

Die Verwendung von Autorelease-Pools bedeutet, dass Sie möglicherweise etwas ungenutzten Speicher herumliegen lassen. Da dem iPhone weniger Speicher zur Verfügung steht, können Sie die Leistung verbessern, wenn Sie nicht benötigten Speicher so schnell wie möglich freigeben, anstatt ihn herumliegen zu lassen und Ressourcen zu verbrauchen, während es auf eine automatische Freigabe wartet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X