Swift Speicherverwaltung
Diese Frage wurde aufgeräumt und die wichtigen info verschoben, um die Antwort weiter unten.
Ich habe einige Fragen zum Speicher-management.
Baue ich noch eine Foto-Bearbeitungs-app. So halten Sie die Speicherauslastung niedrig ist wichtig.
Auch werde ich nicht zum posten von code, weil ich nicht haben einen großen Speicherverlust, wenn Sie eine bestimmte Sache. Ich nur verlieren ein paar KB/MB ist mit allem, was passiert ist. Und gehen über Tausende von Zeilen code zu finden, der Kb ist kein Spaß 😉
meine app benutzt core data, viel cifilter Zeug, den Standort und die Grundlagen.
Mein Erster Blick ist nur ein tableview, die mich kostet etwa 5 MB des Speichers.
Dann nehmen Sie einige Fotos, wenden Sie einige Filter, dieser wird gespeichert in core data und dann gehen Sie zurück zur ersten Ansicht.
Ist es möglich, wirklich alles loswerden, in Speicher, mit Ausnahme der Daten, die zum Laufwerk, auf den ersten Blick. (dass sehr sparen und tolle 5mb)
Oder wird es immer etwas Links hinter, auch wenn Sie setzen Sie alles auf null?
Bonus-Frage:
gibt es einen Unterschied in der Dateigröße /cpu-Last zwischen UIImageJPEGRepresentation
und UIImagePNGRepresentation
?
Ich weiß, Sie können eine Kompressions-Qualität mit der JPEG-Methode (härter auf der cpu/gpu?).
Nur versuchen, zu reduzieren, - Speicher-Druck mit allen möglichen Mitteln.
Update:
Es wurde mich darauf hingewiesen, dass die Frage vielleicht zu ungenau.
Die Probleme, die ich hatte bei einigen oder anderen Punkt, waren die folgenden:
- Auf einige Punkte maximale Speichernutzung zu hoch
- Die Navigation zu einem zweiten viewcontroller und zurück verursacht ein Leck
- Der Bearbeitung eines Bildes verursacht einen Speicherverlust.
- Anwenden eines filters auf mehr als 4-5 Bilder verursacht einen Absturz wegen zu wenig Arbeitsspeicher gab es keine weiteren Speicher-Lecks an dieser Stelle. (verifiziert Instrumente)
P. s das war, alle getestet auf einem iPhone 4s , nicht der simulator.
Es war ein meme hier, um zu erhellen die Stimmung auf dieser Seite ein wenig.
InformationsquelleAutor der Frage R Menke | 2015-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Frage wurde lange genug offen und ich fühle mich jetzt sicher genug, Sie zu beantworten.
Verschiedenen Ebenen MM:
Hardware-Speicher
Swift mit ARC wir keine Möglichkeit haben, zu bereinigen die tatsächliche hardware-ram. Wir können nur machen es möglich, den OS zu tun für uns. Ein Teil wird mit dem richtigen code (
optionals
undweak
) der andere Teil ist die Schaffung von Zeit für die OS zu tun, ist es Arbeit.Vorstellen, dass wir eine-Funktion, die läuft auf alle threads auf unbestimmte Zeit. Es tut eine Sache, ein Bild laden, konvertieren, um schwarz/weiß und speichern.
Alle Bilder, die max bei ein paar mb ' s und die Funktion erstellt keine Software Speicherlecks.
Da die Bilder nicht haben eine festgelegte Größe und können unterschiedliche Kompression, Sie haben nicht die gleiche Stellfläche.
Diese Funktion wird immer zum Absturz der app.
Diese "Hardware" Memory Leak verursacht wird, die von der Funktion immer unter der nächsten verfügbaren slot Speicher.
Das Betriebssystem nicht Schritt "tatsächlich den Speicher bereinigen", da gibt es keinen Leerlauf. Setzen Sie eine Verzögerung zwischen jedem Arbeitsgang vollständig behebt.
Sprachspezifische MM
Casting
Einige Operationen keine Auswirkungen auf das Gedächtnis, andere tun:
Versuchen casting statt:
Reference Types vs. Value Types | Classes vs Strukturen
Beide haben Ihre Vorteile und Ihre Gefahren.
Strukturen sind speicherintensiv, weil Sie Wert-Typen.
Dies bedeutet, dass Sie kopieren den Werten, bei anderen Instanz zugewiesen ist., effektiv Verdoppelung der Speichernutzung.
Es gibt keinen fix /workaround. Es ist, was macht Structs Structs.
Klassen nicht über dieses Verhalten, weil Sie Referenz-Typen. Sie kopieren nicht, wenn der zugewiesene.
Stattdessen schaffen Sie andere Referenz der gleiche Objekt. ARC oder Automatic Reference Counting " ist, was hält den überblick über diese Referenzen.
Jedes Objekt hat einen Referenzzähler. Jedes mal, wenn Sie zuweisen, es geht bis um eins. Jedes mal, wenn Sie eine Referenz auf nil, die einschließende Funktion beendet ist, oder das einschließende Objekt deinits, wird der Zähler nach unten geht.
Wenn der Zähler zuvor auf 0 das Objekt ist deinitialised.
Es ist ein Weg, um zu verhindern, dass eine Instanz von deinitialising, und dadurch ein Leck. Dies wird als eine Starken Referenz-Zyklus.
Gute Erklärung der Schwachen
stellen Sie einen Verweis auf
weak
inout
Funktionen erfassen der übergebenen Werte. Es ist aber auch möglich, zu markieren, diese Werte als inout. Hier können Sie ein Struct an eine Funktion übergeben, ohne das kopieren der Struktur. Dies könnte sparen Sie Speicher, je nachdem, was Sie weitergeben und was Sie tun in der Funktion.
Es ist auch ein netter Weg, wie man mehrere Werte zurückgeben, ohne Verwendung von Tupeln.
Funktionale Programmierung
Zustand ist-Wert im Laufe der Zeit
Funktionale Programmierung ist der Zähler Teil der objektorientierten Programmierung. Funktionale Programmierung verwendet Unveränderlichen Zustand.
Mehr auf dieser hier
Objekt-Orientierten Programmierung verwendet Objekte, die verändert/mutiert Staaten. Anstatt einen neuen Wert, die alten Werte sind aktualisiert.
Funktionale Programmierung kann mehr Arbeitsspeicher verwenden.
Beispiel auf FP
Optionen
Optionen ermöglichen Ihnen das festlegen, was zu nil. Dies senkt die Referenz-Anzahl der Klassen-oder deinitialise Strukturen. Einstellung Dinge zu null ist der einfachste Weg, um clean-up-Speicher. Dies geht hand in hand mit dem BOGEN. Sobald Sie festgelegt haben, werden alle Referenzen einer Klasse zu null-es wird deinit und Speicher freizugeben.
Wenn Sie nicht erstellen Sie eine Instanz optional, die Daten bleiben im Speicher, bis der umschließenden Funktion beendet oder der umschließenden Klasse deinits. Sie vielleicht nicht wissen, Wann dies passieren wird. Optionen geben Ihnen die Kontrolle über das, was am Leben bleibt, für wie lange.
API-MM
Viele "memory leaks" sind die Ursache von Frameworksdass eine "clean-up" - Funktion, die Sie nicht genannt haben.
Ein gutes Beispiel ist
UIGraphicsEndImageContext()
Kontext bleiben im Speicher, bis diese Funktion aufgerufen wird. Es nicht sauber, wenn die Funktion, erstellt der Kontext endet, oder wenn das Bild eingebunden ist festgelegt auf null.Weiteres gutes Beispiel ist die Entlassung ViewControllers. Es könnte sinnvoll sein, segue zu einem VC und dann segue zurück, aber der Wechsel tatsächlich schafft ein VC. Ein Wechsel zurück nicht zerstören VC. Rufen Sie
dismissViewControllerAnimated()
zu entfernen es aus dem Speicher.Lesen Sie die Referenzen ein und überprüfen es gibt kein "clean up" - Funktionen.
Wenn Sie brauchen Instrumente, um ein Leck zu finden, schauen Sie sich die anderen Antworten auf diese Frage.
InformationsquelleAutor der Antwort R Menke
klicken Sie auf Ihre apps Namen in der oberen rechten Ecke von Xcode.
klicken Sie auf "edit System" in dem Menü, das erscheint.
stellen Sie sicher, dass 'RUN' ist auf der linken Seite ausgewählt, dann klicken Sie auf die Registerkarte "Diagnose" in der Nähe des oberen Rand des Fensters.
unter "memory management" - header aktivieren Sie das Kontrollkästchen "aktivieren Guard Malloc'
können Sie auch wollen, um zu versuchen, die Kontrolle verteilter Objekte' und 'malloc-stack" unter 'logging' - header
mehr info auf malloc guard, guard Kanten und kritzeln können gefunden werden hier.
hoffe, das hilft!
InformationsquelleAutor der Antwort DeveloperACE