Warum beendet iOS meine App, auch wenn ich als Reaktion auf Speicherwarnungen viel Speicher freigeben muss?

8

Ich kann nicht herausfinden, warum iOS meine App (iPad, iOS 4) aufgrund der Speicherauslastung beendet, auch nachdem ich eine Menge Speicher als Reaktion auf Warnungen mit geringem Speicherverbrauch freigegeben habe. Zum Beispiel ist hier ein typisches Beendigungsszenario, bei dem ich die Speichernutzung immer wieder protokolliere - schau dir die Anwendung "app" an, den ersten KB-Wert in jeder Zeile:

%Vor%

Sie können sehen, dass die App-Speicherbelegung zunimmt, bis eine Speicherwarnung angezeigt wird. Dann antworte ich richtig auf die Speicherwarnung und befreie einen Haufen (250MB!) Speicher. An diesem Punkt ist meine App beendet und iOS geht auf den iPad-Startbildschirm.

Die Protokolle zur Speicherbelegung werden hier mit meiner Funktion logMemoryUsage () angezeigt, die auf Code von diese Antwort .

Für die Aufnahme verwende ich SDWebImage , um UIImages im Speicher zwischenzuspeichern, aber wie gezeigt, behandelt es Speicherwarnungen durch Leeren sein Cache (an dieser Stelle ziemlich groß). Ich weiß, dass ich SDWebImages Zwischenspeicherung optimieren konnte, um nicht den gesamten verfügbaren Speicher zu füllen und nur auf Speicherwarnungen zu warten, aber das wirft die folgende Frage auf ...

Warum beendet iOS meine App, obwohl ich auf Speicherwarnungen reagiere, indem ich jede Menge Speicher freisetze?

    
Ben Hoyt 14.12.2011, 19:09
quelle

5 Antworten

11

Dies ist eine Art allgemeine Antwort für gute Praktiken bezüglich der Speicherverwaltung usw. Im Allgemeinen werden Sounds wie der In-Memory-Cache einfach zu groß und obwohl sie Objekte als Reaktion auf Speicherwarnungen freigibt, ist es zu dieser Zeit auch spät.

  1. Speicherwarnungen sind nicht von Natur aus "schlecht" und Sie können sie nicht vermeiden. Sie sind ein normaler Teil eines iOS-Lebenszyklus und Sie müssen sie korrekt behandeln, indem Sie alle nicht wesentlichen Daten in allen Ihren Objekten freigeben, um sicherzustellen, dass sich Ihre App verantwortungsvoll verhält. Selbst wenn Ihre App eine kleine Grundfläche hat, können Sie immer noch eine Speicherwarnung b / c anderer Bedingungen auf dem fraglichen Gerät erhalten (z. B. andere verwendete Apps usw.). Ich beziehe mich hier auf die Laufzeitbenachrichtigung UIApplicationDidReceiveMemoryWarningNotification . Die Debugger-Nachrichten (z. B. "Speicherempfangwarnung. Stufe = 2") sind spezifisch für Ihre App, obwohl sie nicht unbedingt mit dem Empfang einer Laufzeitbenachrichtigung korrelieren.

  2. Ich weiß nicht viel über SDWebCache . Ich würde mir die Implementierung ansehen und sicherstellen, dass sie Speicher effizient freisetzt. Beispielsweise könnte die Verwendung von @autoreleasepool an relevanten Stellen dazu beitragen, Objekte in einer Ausführungsschleife effizienter freizugeben.

  3. Sie sollten sich bemühen, den Speicherbedarf Ihrer App so gering wie möglich zu halten. Es ist in Ordnung, einen In-Memory-Cache für Bilddaten zu verwenden, aber ich würde seine Größe begrenzen. Wenn der Footprint deiner App & gt; 250 MB Ich bin nicht überrascht, dass es beendet wird, selbst wenn Sie Speicherwarnungen behandeln. Bis dahin ist es wahrscheinlich zu spät.

  4. Sie könnten andere Probleme haben, die zur Kündigung führen / beitragen. Wie die Kommentare vorgeschlagen haben, müssen Sie mehr Debugging in den Instrumenten durchführen, um nach Lecks, schlechtem Zugriff usw. zu suchen. Es wäre hilfreich, hier das Absturzprotokoll zu veröffentlichen.

XJones 16.12.2011 19:51
quelle
1

Ohne weitere Informationen kann ich nicht wissen, ob diese auf Sie zutreffen, aber ich habe häufig auf bestimmte Probleme gestoßen, nachdem ich versucht habe, Speicherwarnungen zu bereinigen:

  • Unbekannte zirkuläre Referenzen verhindern, dass der Speicher wie erwartet freigegeben wird. Benutze Instrumente, um nach ihnen zu suchen. Ich habe vor kurzem einen Fall behoben, in dem ich versehentlich self innerhalb eines Blocks verwendet habe, was zu einem Zurückhalten geführt hat. Wir haben es bemerkt, als es eine Speicherwarnung gab, und wir konnten uns durch die Freigabe dieser Ressource nicht von der Warnung erholen.
  • Ressourcen bereinigen - oder eine automatische Freigabe von Ressourcen - hat etwas freigesetzt, das noch benötigt wird. Sie können eine Null haben, wo Sie keine erwarten, oder Sie können auf einen Zombie operieren. Überprüfen Sie Ihre Aufbewahrung und Aufräumarbeiten, insbesondere die Anzahl der Delegierten. Schalte Zombies und einen Ausnahme-Breakpoint ein.

Normalerweise ist es die beste Lösung, zu verhindern, dass die Speicherwarnung überhaupt auftritt.

    
Peter DeWeese 14.12.2011 22:29
quelle
1

Überprüfen Sie den Code für die Bildumwandlung. Es gibt Code im SDWebImage-Projekt, mit dem das Bild verkleinert wird, das eine Transformation anwendet. Rotationstechniken auf dem Bild ausgewählt.Es tatsächlich nicht so sehr verwendet, um die Größe zu verkleinern, aber manchmal verursacht es die Speicherwarnung erhöhen. Kommentiere diesen Code & amp; Versuchen Sie, Ihre Anwendung zu erstellen.

Ich hatte das gleiche Problem in meiner App. Ich hatte versucht, den Code der Transformation zu kommentieren. Problem wurde gelöst. Sie können auch versuchen.

    
iCreative 22.12.2011 15:37
quelle
1

Eine Speicherwarnung der Ebene 2 lautet Dringend . Ihre App erhält wahrscheinlich eine oder mehrere Warnungen der Stufe 1, bevor Sie eine Warnung der Stufe 2 erhalten, und Sie sollten in diesem Moment handeln.

Nach meiner Erfahrung ist es fast immer zu spät, wenn Ihre App eine Warnstufe 2 erhält, und sie wird trotzdem getötet.

    
n-b 22.12.2011 23:51
quelle
1

Beim Umgang mit großen Bildern (4 MB pro Bild) besteht die Gefahr, dass nicht genügend Speicher vorhanden ist, ohne dass eine Warnmeldung für zu wenig Speicher ausgegeben wird.

Am besten verhindern Sie, dass Ihre Speicherbelegung zu stark anwächst. Die Ladegeschwindigkeit von Bildern ist so, dass Caching zwar gut, aber nicht wirklich notwendig ist. Es ist viel besser, die Nutzung niedrig zu halten, indem Sie Speicher freigeben, sobald Sie ihn nicht mehr verwenden.

Viel Glück und lassen Sie uns wissen, wenn Sie etwas finden, das es wert ist, geteilt zu werden.

    
MiKL 23.12.2011 13:27
quelle