Wir verwenden NSCache für UIImages in unserer App. Dies funktioniert auf iOS-Versionen kleiner als 7. Wenn eine Speicherwarnung auftritt, gibt NSCache Objekte wie vorgesehen frei. Unter iOS 7 stürzt unsere App jedoch kurz nach der ersten Speicherwarnung ab. Es sieht also so aus, als würden Objekte, die mit NSCache gespeichert wurden, nie freigegeben, aber der Cache wächst, bis die App abstürzt. Profiling mit Instrumenten bestätigt diesen Verdacht.
Hat jemand anderes dieses Problem festgestellt und haben Sie einen Workaround gefunden oder haben Sie bereits einen Fehler gefunden?
Sieht so aus, als hätten die Jungs das gleiche Problem: Ссылка
Ich habe eine kleine Beispiel-App erstellt, um das Problem zu veranschaulichen. Wenn eine Schaltfläche gedrückt wird, wird die Methode -(IBAction)fillCache:(id)sender
aufgerufen. Ab diesem Zeitpunkt ruft ein Timer -(void)addImageToCache:(id)sender
alle 100 ms auf. In dieser Methode wird ein UIImage generiert und in den Cache geschrieben.
Auf dem iPad Mini mit iOS 7.0.3 und seinem 512 MB Speicher stürzt es nach ~ 350 Iterationen ab.
Auf dem iPad 2 mit iOS 5 und auch 512 MB Speicher stürzt es irgendwann ab, aber erst nach mindestens 3000 Iterationen. Instruments zeigt, dass die Anzahl der UIImage-Instanzen bei jeder Speicherwarnung abnimmt. Dies ist bei iOS 7 nicht der Fall.
%Vor% Während NSCache
niemals auf Speicherwarnungen reagiert hat, habe ich festgestellt, dass es im Allgemeinen auf den wahren Speicherdruck reagiert hat. Der Fehler, auf Speicherwarnungen zu reagieren, war schon immer ein bisschen lästig (z. B. konnte man nicht einfach die "Speicherwarnung simulieren" verwenden, um das Verhalten einer App im Speicherdruck zu testen).
Nachdem ich das gesagt habe, sehe ich das gleiche Verhalten, das Sie beschreiben. iOS 7 scheint das NSCache
Verhalten geändert zu haben.
Persönlich habe ich einfach eine einfache NSCache
Unterklasse, die alle Objekte beim Empfang der UIApplicationDidReceiveMemoryWarningNotification
Benachrichtigung entfernt:
Das NSCache-Objekt entfernt seine Daten basierend auf seinen eigenen Regeln. Das bedeutet nicht, dass Inhalte während einer Speicherwarnung freigegeben werden.
Hier, was das Dokument sagt:
Die NSCache-Klasse enthält verschiedene automatische Räumungsrichtlinien, die Stellen Sie sicher, dass ein Cache nicht zu viel Speicher des Systems beansprucht. Ob Speicher wird von anderen Anwendungen benötigt, diese Richtlinien entfernen einige Objekte aus dem Cache, wodurch der Speicherbedarf minimiert wird.
Vermutlich wurden einige Richtlinien in iOS7 geändert. Sie können alle Inhalte entfernen, indem Sie Speicherwarnungsbenachrichtigungen abhören. Ich verbinde diese Antwort der Vollständigkeit halber.
Tags und Links memory objective-c ios7 nscache