iPhone Development - Lektionen in der Speicherverwaltung

8

Ich brauche Unterricht in der Speicherverwaltung. Ich habe eine Anwendung, die mehrere Ansichten (etwa 10) verwendet, einige davon sind an den Tab-Controller angeschlossen. Problem ist, dass ich Bilder verwende (viele Bilder, die ich von einem Webdienst lade). Ich stehe vor den folgenden Problemen.

  1. Der Speicher wird immer größer, wenn ich in der Tabellenansicht blättrele (warum?) - Ich habe die Anwendung CustomTableViewCell von der Apple-Website überprüft und zeigt dieselben Zeichen, wenn ich sie mit Instruments starte.

  2. Ich verwende Autorelease mit vielen Objekten, aber ich sehe, dass diese Objekte nicht wirklich freigegeben werden und der Speicher verdrahtet ist. Wie kann ich diese Objekte loswerden?

  3. Wie kann ich dem NSAutoreleasePool mitteilen, dass die Objekte, die nicht verwendet werden, regelmäßig freigegeben werden? Ich denke, das kann mir helfen, verdrahtetes Gedächtnis loszuwerden. Aber kann ich das tun?

Gibt es ein Beispiel von Apple oder jemand anderem (Buch- oder Online-Artikel), in dem erklärt wird, wie man Instrumente verwendet (in einem kleinen Detail mit Beispiel?) und um die Anwendung für Speicher und Leistung fein abzustimmen?

Danke.

    
Mustafa 21.01.2009, 11:27
quelle

5 Antworten

8

Nun, da wir die Antwort "nur nein sagen" zur Autorelease haben, dachte ich, ich würde einen Tipp hinzufügen, wie man die Autorelease effektiver nutzen kann. Zum Besseren oder Schlechteren wird nicht jeder Autorelease vollständig vermeiden - nur aus dem Grund, weil Apple so viele Komfort-Methoden zur Verfügung stellt, die Ihnen Autoreleased-Objekte übergeben.

Sie können dem Autorelease-Pool nicht nur mitteilen, dass er Objekte freigibt, die Sie nicht verwenden. Es gibt keine Müllsammlung und wie sonst wird es wissen?

Sie können einen lokalen Autorelease-Pool erstellen und diesen dann freigeben, wenn Sie die lokalen, automatisch freigegebenen Objekte nicht mehr benötigen. Wenn Sie einen Block haben, in dem Sie automatisch freigegebene Objekte erstellen, stellen Sie sicher, dass sie freigegeben werden, indem Sie am Anfang des Blocks einen lokalen Autorelease-Pool erstellen (einfach zuweisen / init, keine Magie erforderlich) und dann den Pool freigeben Ende des Blocks. Und voila, und Objekte im Pool sind ebenfalls freigegeben.

Autorelease-Pools verschachteln, also denken Sie daran, wenn Sie dies tun. Wenn Sie einen Autorelease-Pool freigeben, vergewissern Sie sich, dass es sich um den zuletzt zugewiesenen Pool und nicht um einen anderen Pool handelt.

    
Tom Harrington 21.01.2009, 17:29
quelle
1

Der automatisch freigegebene Speicher wird freigegeben, wenn die Steuerung an das System zurückgegeben wird, aber nur, wenn sie dies wünscht. Wenn Sie die Freigabe des Speichers erzwingen wollen, benutzen Sie "release", was dort funktioniert.

Es sollte angemerkt werden, dass das Zuweisen und Freigeben eines Speicherblocks aufgrund von Speicherfragmentierung nicht dazu führen kann, dass Sie in messbare "freie" Speicher zurückversetzt werden.

Tony

    
AnthonyLambert 21.01.2009 11:34
quelle
1

Aus Leistungsgründen empfiehlt Apple, dass Sie Objekte möglichst selbst behalten / freigeben. Wenn sie automatisch freigegeben werden, kann dies zu einer übermäßigen Speichernutzung führen, da die automatisch freigegebenen Objekte nicht immer sofort freigegeben werden.

Wenn Sie also wissen, dass Sie mit einem Objekt fertig sind, geben Sie es explizit frei.

    
August 21.01.2009 13:40
quelle
1

Das UITableView bietet eine Möglichkeit, Tabellenzellen wiederzuverwenden, die nicht mehr angezeigt werden. Wenn Sie also nur 6 Zellen gleichzeitig auf dem Bildschirm anzeigen, wird beim Scrollen nicht mehr mehr erstellt, sondern die Zellen, die vom Bildschirm verschwunden sind, wieder verwendet. Wenn Sie eine neue Zelle erstellen möchten, fragen Sie zuerst die Tabellenansicht ab, um festzustellen, ob sie erneut verwendet werden kann. Wenn nicht, erstellen Sie eine neue Zelle.

Ein Beispiel dafür finden Sie auf der Folie 55 der Standford-iPhone-Kursnotiz, die Sie hier finden: Ссылка

    
mwahab 21.01.2009 18:16
quelle
0

Laut Apple sollten Sie keine automatische Freigabe verwenden und stattdessen Objekte explizit beibehalten und freigeben, wenn dies erforderlich ist. Autorelease wird ein Objekt nicht freigeben, sobald seine Funktion beendet ist. Wenn Sie in der Tabellenansicht Bilder verwenden, die von einem Webservice heruntergeladen wurden, versuchen Sie, diese Bilder zwischenzuspeichern und wenn möglich wiederzuverwenden. Eine andere Möglichkeit besteht darin, nur die Bilder zu erhalten, die angezeigt werden.

    
lostInTransit 21.01.2009 14:57
quelle

Tags und Links