2013-04-02 5 views
6

Ich habe Speicherprobleme mit einer meiner Apps, und ich habe "Real Memory" wie in Instruments> Activity Monitor definiert als möglichen Täter identifiziert.iPad iOS Speicherverwaltung - wie man "Real Memory" freigibt, das von UIImageViews, UIScrollViews verwendet wird?

Meine App reserviert große UIImages innerhalb UIScrollViews. Auf eines der Bilder wird ein CImageFilter angewendet. Der Aktivitätsmonitor zeigt, dass beim ersten Drücken des View-Controllers, der Scrollviews mit großen Bildern enthält, die tatsächliche Speicherbelegung auf etwa 300 MB springt. Nachfolgende Schübe/Pops heben es auf etwa 500 mb:

ich gelesen, dass „Live-Bytes“ keinen Speicher von Texturen und CALayers verwendet zählen, so meine Frage ist: Wie löse ich richtig Speicher, der durch CALayers der verwendet wird, mein Bild/Scrollviews?

Siehe die realen Speichernutzung blau Kreisdiagramm auf der rechten Seite:

enter image description here

realen und virtuellen Speicher sind die höchsten für diesen Prozess:

enter image description here

Was mich stört ist, dass ich versuche, meine großen scrollviews und Bilder aufzuräumen, wenn ich diesen Controller knacke, und die Zahlen für die "Live Bytes" gehen auf ungefähr 5 MB herunter, während "Real Memory "Bleibt unverschämt hoch (~ 500 MB):

ContainerScrollView* container = ...; 
[container.view removeFromSuperview]; 
container.view = nil; 

Hier ist die Zuteilungen Profilierung: enter image description here

+0

Wenn Sie bei jedem Test eine neue Scrollview instanziieren, führen Sie dann die gleichen Bilder ein? –

+0

Haben Sie versucht, eine Speicherwarnung auszulösen, um sicherzustellen, dass System-Caches als Reaktion darauf reagieren und (hoffentlich) nicht verwendete Daten löschen? Denken Sie daran, dass 'imageNamed' einen Cache verwendet. – jhabbott

+0

Speicherwarnungen werden ausgelöst. Scrollviews erhalten Bilder von der Fotobibliothek, die der Benutzer auswählt. –

Antwort

1

ich eine Person gefunden hier ein ähnliches Problem auftreten:

Mysterious CoreImage memory leak using ARC

Die Antwort (Ich hoffe wirklich, es ist) scheint zu beginnen mit NSData dataWithContentsOfFile: und dann erstellen Sie eine UIImage imageWithData:. Haben Sie ein Bild, das ein Nutzer ausgewählt hat? Schreiben Sie es in eine temporäre Datei und lesen Sie es zurück. Ich traue anderen Bildmethoden nicht zu, da sie sich in meinen 12 Teststunden irrational in iOS 6.1.2 für große Bildansichten verhalten.

+0

Upvoted für Ihre eigenen Hausaufgaben so gut. Siehe auch meine Antwort hier: http://Stackoverflow.com/a/15694549/341994 zusammen mit den Kommentaren, die darauf folgen. ImageIO Framework gibt Ihnen viele Optionen, die sehr hilfreich sein können, und vermeidet das implizite Caching von UIImage imageNamed, das im Herzen von so vielen Speicherproblemen liegt. – matt