Speicher Warnung und crash: wie es zu handhaben
Verwende ich Instrumente, um zu sehen, Speicherverluste. Zumindest in einem Szenario, in dem ich ständig bin durchblättern Folien/Seiten (innen UIScrollView) ich sehe keine memory-leak. Mit Instrumenten - unter "Zuweisung Lebensdauer", schalte ich um auf Sicht "Erstellt & Leben Noch" und siehe Speicher um 1.17 MB ganz. Ich nehme an, dies bedeutet, dass meine app nutzt nur so viel tatsächlichen Speicher und der rest wird ordnungsgemäß recycelt.
Doch nach dem durchblättern 100 Seiten oder so, bekomme ich eine memory Warnung und dann paar von meinen Ansichten entladen werden, was einen Absturz der ganzen app.
Wenn ich bin nicht mit viel Speicher haben und keine memory-leak-warum habe ich erhalten-memory-Warnung ? Da kann ich nichts wirklich release ich nicht einen Weg finden, um den Absturz zu vermeiden. Jeder erlebt diese situation, oder weiß, was kann ich tun ? Bin ich falsch interpretiert, die nichts von Instrumente ? Vielen Dank für jeden Kommentar.
- Keine Ahnung noch. Vielleicht 'Instrumente' ist nicht richtig, die Berichterstattung einige Leck, das ich haben könnte. Gibt es andere memory-leak-Suche nach tools, welche sind zuverlässiger ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Dokumentation sagt:
So, jedes Bild, das Sie laden mithilfe
imageNamed:
weiterhin im cache vorhanden sind nach dem release Ihres letzten Eigentumsverhältnisse.Instrumente nicht zeigen, dies als ein Leck, weil es streng genommen gar nicht ist: Etwas (UIImage) noch kennt diese Bilder. Die Lecks instrument wird nur ein Leck zeigen für ein Objekt, das existiert, aber nichts weiß über.
Können Sie immer noch sehen, dass dies Instrumente, obwohl.
Dann, wenn Sie mit der Maus über die Spalte address für eine Instanz in der Zeile, sehen Sie die gleiche Taste; dieses mal, indem Sie darauf klicken werden Sie auf die Geschichte der Adresse, einschließlich aller Kreationen, Selbstbehalte, Versionen und deallocations von Objekten, die mit dieser Adresse.
Hier können Sie das Bild sehen, ist die Zuweisung (innerhalb der Klasse UIImage, die von Ihnen bestellte ein paar stack-frames hinunter), retention (durch Sie), und lassen (Sie). Sie können auch sehen, dass es nicht freigegeben wurde, von UIImage—die
+[UIImage imageNamed:]
cache besitzt immer noch das Bild, damit das "Leck".Wenn Sie nicht wollen, Bilder zu stapeln, wie das, laden Sie sich mit
imageWithContentsOfFile:
und die-[NSBundle pathForResource:ofType:]
Methode.UPDATE: ich habe gelesen, dass seit iOS 3, UIImage wird purge cache in (zumindest einigen) low-memory-Situationen, so dass dies sollte nicht als viel von einem "Leck", wie es früher war. Wahrscheinlich wirst du noch sehen, Gedächtnis häufen, aber dann sollten Sie den Haufen kollabieren schließlich. Wenn Sie immer noch sehen, Speicher, häufen sich und können beweisen, dass es apples Schuld ist, sollten Sie dokumentieren Ihre Erkenntnisse und einen bug.
Haben Sie die
NSZombieEnabled
Umgebungsvariable auf yes gesetzt? Es wird dazu führen, aufgehoben Objekte bleiben in Erinnerung, also nicht so dass Sie wieder die Erinnerung. Also versuchen Sie, es zu deaktivieren, wenn aktiv.Haben Sie überprüft, die Sie freigeben alles, was Sie IBOutlet Objekte?
Auf Ihrem dealloc sollten Sie die Freilassung aller IBOutlet Objekt, das Sie in Sie dem nicht widersprechen, auch wenn Sie nicht über eine Synthese-Methode.
Wir haben ein ähnliches problem und wir haben es gelöst Freigabe alle die IBOutlets.
Überprüfen Sie diese Antwort bei Stack Overflow
Wenn Sie nur noch 3 Seiten, die ich verstehe, dass Sie die Wiederverwendung einige Elemente.
Ohne den rest des Codes, es ist schwierig zu sagen, was falsch läuft, aber vielleicht solltest du versuchen, lassen Sie die cartoon-Objekt, bevor Sie eine neue erstellen.
Probieren Sie etwas wie dieses:
Fand die Quelle des Problems. Es ist in den folgenden snippet
Ich habe 100s von Bildern plus text auf jeder Seite, und Benutzer können Blättern Sie durch Sie mit dem finger schnippen (wie Sie in iphone photo app). Ich habe nur 3 Seiten in meinem UIScrollView und laden/entladen (und auch lassen) alles, was ich ausdrücklich zugewiesen. Also, wenn es um die Freilassung der cartoon, den ich einfach loslassen cartoon UIImageView und nicht die UIImage denken, es wird automatisch freigegeben.
Aber so wie es scheint, wird nicht automatisch freigegeben. Meine app erhält einen Speicher-Warnung (ich nehme keine Aktion) und OS entlädt mein Blick auf den Absturz verursacht.
Wenn ich kommentiere die beiden Zeilen (modifiziert snippet unten), problem geht Weg. Keine Warnung, kein Absturz.
Weiß jemand, wie man dieses Problem umgehen ? Gibt es eine Möglichkeit zu zwingen, Speicher freizugeben, von UIImage, wenn Warnung geschieht ?