iOS : ARC, nicht Freigabe von Speicher
Ich habe irgendwie ein komisches Problem mit meiner iOS app.
nach einer Weile meine app niedrig geht in den Speicher, so dass Speicher-Warnung, alles scheint in Ordnung zu sein, aber wenn ich die Speicherauslastung ich bemerkt, dass alle Aufrufe von viewDidUnload nicht frei, viel Speicher, so dass Sie nach ein paar Klick in meine app, es geht mal wieder in-memory-Warnung, alles scheint wieder gut, aber nicht viel Speicher freigegeben wurde, so geht es wieder in Erinnerung Warnung schneller, und dann es abstürzt (nach dem Dritten Speicher Warnung-die meiste Zeit). dieser Absturz ist zufällig : einfrieren der app, app-Blätter, mein debugger sagt app angehalten, aber keine schlechten Zugang oder sigbort, keine zombies.
meine Vermutung ist, dass der Speicher Warnung kann nicht frei genug Speicher hat sollte es.
(Ich überprüfte alle meine viewDidUnload und machen null alle Objekte zugewiesen werden, in viewDidLoad)
Jede Hilfe wird nützlich sein !
vielen Dank.
Sie haben wahrscheinlich Zirkelverweise in Ihrer app, aber es gibt wirklich keine Möglichkeit zu sagen, aus dieser Beschreibung. ARC ist wunderbar, aber es ist keine Zauberei.
hier ist eine Idee, werde ich überprüfen, danke
Viel Glück, es zu finden. 🙂
Ich habe gerade entdeckt das, das ist, warum ich die Kommentare auf einen alten thread. viewDidUnload ist veraltet, ab iOS 6, und es ist NICHT garantiert, genannt werden (und in meiner Erfahrung ist es nicht genannt, die meisten der Zeit).
InformationsquelleAutor Vassily | 2012-02-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
So habe ich es geschafft zu meinem Problem.
Schrieb ich "-(void) dealloc" methode in meinem Controller, und überprüfen Sie, wenn ich geben in, wie ich es sollte. (auf pop-controller, dissmiss etc..)
Jedes mal, wenn Sie es nicht Tat, ich tun, Schritt für Schritt in die Steuerung, um zu sehen, was war die Beibehaltung meinen controller von beeing dealloc.
meisten der Zeit, es war eine Eigenschaft, die nicht in "unsafe_unretained"
delegieren, wurde in der "WEISEN" (und sollte nicht unter weisen, sondern in unsafe_unretained)
(Erbe aus der non-ARC-Projekt...)
Hatte ich auch einige seltsame controller mit XIB-das war nicht freigegeben, auch wenn Sie leer sind.
Ich Baue neue Schritt für Schritt mit copy/paste und endlich mit genau dem gleichen code, der neue controller veröffentlicht wurde, mit keinen sichtbaren Unterschied zwischen damals !!! gnneee
zumindest weiß ich, wie debug, die Art Fragen, die jetzt...
InformationsquelleAutor Vassily
Ich glaube nicht, dass es irgendeinen Weg geben, um eine bestimmte Antwort, ohne weitere Daten, so dass die besten, die ich tun kann, ist zu vermuten, dass Sie nie mehr raten, was passiert mit Ihrer app und lernen, wie zu Messen, was eigentlich vor sich geht. Führen Sie Ihre app unter Instrumente und Sie werden in der Lage sein zu überprüfen, nach Lecks und auch tatsächlich sehen, was Klassen sind verantwortlich für die meisten Ihrer Anwendung Speicherbedarf.
Sollten Sie sicherstellen, dass Sie wissen, wie Sie die Lecks instrument zu identifizieren durchgesickert Objekts, sondern auch die Zuweisungen instrument zur Identifizierung von verwaisten (aber nicht durchgesickert), die Sätze von Objekten, die veröffentlicht wurden oder nur Fälle, in denen Ihre app reagiert nicht auf Speicher Warnungen, wie Sie erwartet.
https://developer.apple.com/library/ios/#documentation/developertools/conceptual/InstrumentsUserGuide/AboutTracing/AboutTracing.html könnte ein guter Ort, um zu starten und es gibt eine Reihe von tutorials zur Verfügung; http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorial und http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/ sind unter den ersten Ergebnissen, die ich sah.
Hat ich schon sagte, ich habe keine Zombies, Keine Lecks gemessen mit Instrumenten.@"Zuweisungen instrument zur Identifizierung von verwaisten (aber nicht durchgesickert), die Sätze von Objekten, die veröffentlicht wurden oder nur Fälle, in denen Ihre app reagiert nicht auf Speicher Warnungen, als Sie erwartet haben." , ich weiß nicht, wie zu tun...
Ich bin mit ARC, also sowohl raywenderlich und friday.com tutorial nutzlos sind.
InformationsquelleAutor Jonah
Vassily,
Zunächst, wenn Sie nicht selbst die Freigabe zusätzlichen Speicher, der die -didReceiveMemory Warnung tut dir nicht gut und das OS wird immer wieder gefragt, für Speicher, bis Sie getötet werden. Das klingt wie es ist Ihr problem.
Zweiten, wenn das nicht das problem, dann sind Sie wahrscheinlich immer gekündigt aufgrund der Größe des Residenten Speicher-Partitionen. Stellen Sie sicher, Sie schauen Sie auf Ihre VM allocation in Instrumenten. Ich erwarte, dass die MALLOC_TINY oder MALLOC_SMALL haben beide größer als 5 MB Bewohner und schmutzige Fußspuren. Aufgrund der Natur von kleinen Zuteilungen diese VM Regionen wird nie schrumpfen. Die einzige option, die Sie wirklich haben, ist nicht zu schaffen, viele kleine Elemente in den ersten Platz. Das ist wirklich nur etwas ist, können Sie durch ändern Sie den code für die algorithmen zu verwenden, die weniger Speicher.
Andrew
Vassily, lassen Sie Elemente in den BOGEN, indem Sie Ihre Speicher auf null. Im Grunde sagen Sie dem compiler, dass Sie nicht mehr sind, halten eine Referenz auf das Element. Andrew
ok, das ist, was ich Tue. Zum Beispiel : ich alloc ein viewcontroller, dass ich modaly, auf dissmiss ich diese controller auf null. dies sollte frei alle Speicher genommen, indem der modale viewcontroller, aber es funktioniert nicht wenn ich das Profil meiner app.
Vassily, welche Art von view-controller bist du die Zuteilung? Gibt es eine web-Ansicht? Wenn der Speicher nicht freigegeben, dann haben Sie wahrscheinlich einige behalten Zyklen. Eine vernünftige Verwendung von schwachen Referenzen wird das problem lösen. Andrew
ja, es hat webviews. es ist immer das gleiche, vc, dass ich reservieren, dann schieben. (unterschiedliche Inhalte, aber die gleiche viewcontroller)
InformationsquelleAutor adonoho