Custom KeyBoard wird aufgrund des Speicherdrucks in iOS 8 beendet
Zunächst nimmt meine benutzerdefinierte Tastatur ungefähr 25 MB Speicher in Anspruch, aber dieser Speicher wird nicht freigegeben, und ich dissmisse die Tastatur. Der Speicher steigt weiter an, wenn wir die benutzerdefinierte Tastatur immer wieder öffnen und schließlich aufgrund des Speicherdrucks beenden.
Hilf mir mit diesem Problem?
Die Tastaturerweiterung wird in einem Prozess ausgeführt, der nach dem Verschwinden der Tastatur fortbesteht. Ihr Tastatur-View-Controller wird jedes Mal neu erstellt, wenn Ihre Tastatur erstellt wird, aber der Prozess, in dem sich der View-Controller befindet, bleibt bestehen. Also freien Speicher, wenn der View-Controller geschlossen ist. Wenn Sie Bilder verwenden, die Sie nicht mit imageNamed verwenden möchten, sollten Sie imageWithContentsOfFile: verwenden. Weil UIImage einen Cache für imageNamed verwendet, der persistent bleibt.
Ich habe jede Menge Möglichkeiten ausprobiert, um dieses berühmte Gedächtnisproblem zu vermeiden, aber nach meiner langen langen Probezeit habe ich versucht, das Problem zu lösen. Fehler, der beste und einfachste Weg, um alle Speicher zu befreien, bevor eine Tastatur verschwindet, ist exit(0)
in viewWillDisappear
von KeyboardViewController
.
[Update] exit(0)
war perfekt, um den gesamten Speicher freizugeben, da der Tastaturerweiterungsprozess dadurch beendet wird. Leider scheint es so, als würde das Ausschalten des Prozesses iOS instabil machen.
Folglich ist der stabilste Weg, alle zugewiesenen Objekte so weit wie möglich in viewWillDisappear
freizugeben. Zum Beispiel
Für alle benutzerdefinierten Ansichten und alle benutzerdefinierten Ansichtscontroller
Entfernen Sie alle starken Referenzen der Ansichten und der View-Controller, z. B. Subviews, Constraints, Gesten, starke Delegate und so weiter.
%Vor% Setzen Sie nil
auf alle Objekteigenschaften der View-Controller.
Für andere große benutzerdefinierte Objekte
Entfernen Sie alle hinzugefügten Objekte aus allen Arrays, Wörterbüchern usw.
%Vor% Zwischenspeichern von Bildern mit imageNamed:
nicht.
Bei guter Freigabe wird die Speicherbelegung während des Debuggens nicht erhöht oder nur geringfügig erhöht (& lt; 0,1 MB pro Entlassung). Wenn die Speicherbelegung nach vielen Verwerfungen erhöht wird, obwohl benutzerdefinierte Objekte so oft wie möglich freigegeben werden, kann exit (0) in regelmäßigen Abständen mit dem Risiko eines Entladens aufgerufen werden.
Tags und Links memory iphone keyboard ios8-extension