2010-11-25 4 views
2

Ich entwickle eine App, die eine UIScrollView verwendet, um eine Liste von Bildern basierend auf Suchkriterien anzuzeigen. Mit einem Knopf kann der Benutzer mehr Bilder laden.iPhone Speicherverwaltung, um meine App für mehrere Geräte crashsicher zu machen

Wenn auf einem iPhone 4 Testen der Viewcontroller erhält eine Speicher-Warnung bei ~ 750 Bildern. Beim Testen auf einem iPod 2. Generation wird eine Speicherwarnung bei ~ 150 Bildern empfangen.

Mein Verständnis ist, dass, wenn didReceiveMemoryWarning genannt wird, ein Speicher frei durch Objekte, sondern Erholung von Low-Memory-Freigabe ist nicht garantiert.

Ich habe didReceiveMemoryWarning und Release grundsätzlich alle Objekte implementiert. In den Instrumenten sehe ich eine Speicherauslastung von ~ 3MB. Wenn der iPod das erste Mal seine Speichergrenze erreicht, läuft alles gut, der Speicher wird freigegeben und die App nimmt den normalen Betrieb wieder auf. Beim zweiten Aufruf von didReceiveMemoryWarning kann ich zwar die freigegebenen Objekte sehen, aber die App stürzt trotzdem ab.

Also, wie kann ich meine App crash-sicher machen? Ich möchte sicherstellen, dass alle Geräte, auf denen die App ausgeführt wird, so viele Bilder laden können, wie es der Arbeitsspeicher erlaubt, aber ich möchte auch sicherstellen, dass die App nicht abstürzt.

Ich würde es bevorzugen, dass die App nie didReceiveMemoryWarning erreicht und ein Limit für die Anzahl der Bilder setzt, die angezeigt werden können, aber wie kann ich bestimmen, wie viele Bilder jedes mögliche Gerät laden können sollte?

Darüber hinaus ist die Größe der Bilder nicht garantiert. Beim Testen komme ich auf eine beliebige Zahl von 150 auf einem iPod, aber was ist, wenn die Bilder auf dem Server zu einem bestimmten Zeitpunkt doppelt so groß sind? Dann würde die App wahrscheinlich bei 75 Bildern abstürzen.

Irgendwelche Vorschläge?

Antwort

1

Zunächst einmal, was Sie wahrscheinlich tun möchten, ist nicht alle Ihre Bilder auf einmal anzuzeigen. Sie möchten, wahrscheinlich, nur die Bilder, die gerade sichtbar sind, sowie einige, die vorinstalliert sind, wenn der Benutzer zu diesem Ort scrollt.

Das ist viel die gleiche Art und Weise, wie die Fotos App funktioniert, wie UITableView umgesetzt wird. Im Grunde läuft es auf diese nach unten:

Sie haben Ihre Hauptscrollview, und im Inneren haben Sie einzelne Zellen. Diese Zellen sind kleine Ansichten, die bei bestimmten Offsets als Unteransichten zu Ihrer Scrollview hinzugefügt werden. Sie fügen dann Ihre Bilder diesen Zellen hinzu.

Wenn ein Benutzer die Bildlaufansicht scrollt, werden Sie zuerst aufgefordert, eine neue Zelle aus der Bildlaufleiste zu entfernen, ähnlich wie Sie eine Tabellenansicht anfordern, um eine Zelle aus der Warteschlange zu entfernen. Dies spart die Kosten einer Zuteilung, wenn eine recycelt wurde. Wenn Sie einen aus einem recycelten Satz nicht herausnehmen können, müssen Sie einfach eine Zuteilung vornehmen, wie Sie es gerade tun.

Um dieses Zellrecycling zu implementieren, müssen Sie außerdem sehen, welche Zellen auf dem Bildschirm sichtbar sind. Wenn eine oder mehrere Zellen vom Bildschirm verschwinden, fügen Sie sie den von Ihnen erstellten recycelten Zellen NSSet hinzu. Dieses Set enthält nur Zellen für das spätere Recycling. Es gibt einen Beispielcode, den Apple hat, der das demonstriert, und es heißt PhotoScroller. Es wird auch in einem WWDC10-Video gezeigt, Sitzung 104.Ich schlage vor, Sie sehen es an. Ignoriere die Teile über Fliesen, du brauchst das nicht für deinen Zweck zu wissen.

Sobald Sie dies an Ort und Stelle haben, werden Sie gezwungen, Ihre Zellen nur dann einzurichten, wenn sie benötigt werden, was ebenfalls ein wichtiger Aspekt dieses Verhaltens ist.

Schließlich, wenn Sie eine Speicherwarnung erhalten, lassen Sie einfach den Satz recycelter Zellen fallen. Wenn Sie jemals hoch genug werden, dass das wichtig ist, das heißt, Sie sparen ein paar MBs Speicher. :) (Vergessen Sie nicht, es zu implementieren, wenn Sie temporäre Daten behalten, die Sie nicht unbedingt benötigen ... Zellen, die auf dem Bildschirm nicht sichtbar sind, sind ein gutes Beispiel dafür, ebenso wie Caches.)

0

Sie sollten faul Ihre Bilder laden und laden nur die Bilder, die Sie zu diesem Zeitpunkt benötigen. Ihre App kann nicht alle diese Bilder auf einem Bildschirm anzeigen, also sollten Sie in Ihrem Scrollview nur die Bilder laden, die auf den Bildschirm passen und vielleicht ein paar davon, und der Benutzer scrollt, um die Bilder freizugeben, die er nicht mehr benötigt .