Wie erkennt man eine Speicherwarnung für Level 2 in iOS?

8

Apple definiert Lev = 1 und Lev = 2 Speicher Warnungen als sehr unterschiedlich (man ist "hmm. nicht viel Speicher um. Sei vorsichtig", der andere ist "Ich bin dabei, einen Prozess zu töten, haben Sie 5 ... 4 ... 3 ... ")

... aber wie finden Sie programmatisch welches Sie erhalten haben?

Ich habe eine iPad-App, die Bilder mit speziellen Tools verarbeitet, und lev = 1 Speicherwarnungen sind unvermeidbar - selbst wenn ein Bild in kleinen Stücken verarbeitet wird, verbraucht es immer noch viel Speicher, nur um die gesamte GUI anzuzeigen.

Ich bekomme lev = 1 die ganze Zeit und es gibt buchstäblich nichts, was ich dagegen tun kann.

lev = 2 Speicherwarnungen sind eine ganz andere Sache. Wenn ich einen lev = 2 erhalte, bedeutet das normalerweise, dass eine Hintergrund-App viel Speicher beansprucht oder dass etwas, was der Benutzer getan hat, aufgeblähtes Gedächtnis hat - und ich Notfallmaßnahmen ergreifen muss, um zu verhindern, dass ich getötet werde. Es gibt Dinge, die ich tun kann - aber ALLE von ihnen sind schlecht für den Benutzer (z. B. alle GUI entfernen, warten Sie ein paar Sekunden, dann laden Sie es neu).

Also ... Ich brauche zwei verschiedene Codepfade in "didRecieveMemoryWarning": einen für lev = 1 Warnungen und einen für lev = 2 Warnungen.

EDIT: einige Informationen über Warnstufen: iPhone OS Speicherwarnungen. Was bedeuten die verschiedenen Ebenen?

NB: Apple "dokumentiert" häufig Dinge nicht. Wenn wir als Entwickler nur an den dokumentierten Informationen und den fehlerfreien Teilen der API festhalten würden, dann würden viele (die meisten?) Der grenzübergreifenden Apps erst nach mehreren iOS-Versionen später existieren. Stattdessen arbeiten wir an den Fehlern und wir arbeiten heraus, was tatsächlich passiert, wenn Apple es nicht dokumentiert.

EDIT2: ... schaut in die verlinkte Header-Datei, sieht aus, als hätte sie die zugrunde liegende private Funktion, die Apple verwendet, um herauszufinden, welche Ebene aktuell ist: "OSMemoryNotificationLevel OSMemoryNotificationCurrentLevel (void)" - aber ich denke, wir können nicht diese vergangene Apple Einreichung :(?

    
Adam 28.09.2011, 09:41
quelle

2 Antworten

6

Ich glaube nicht, dass die Warnstufe für Anwendungen zur Verfügung gestellt wird, aber - und ich weiß, dass dies nicht das ist, was Sie hören wollen - das ist nicht wirklich wichtig. Nur weil das Betriebssystem zwei verschiedene Ebenen der Speicherwarnung hat, bedeutet das nicht, dass Sie auf jeder Ebene verschiedene Dinge tun sollten und hoffen, dass andere Anwendungen das Richtige tun.

Die Dokumentation sagt:

  

Es wird dringend empfohlen, diese Methode zu implementieren. Wenn dein   Anwendung gibt nicht genügend Arbeitsspeicher bei wenig Arbeitsspeicher frei   Bedingungen, kann das System es direkt beenden.

Es gibt keine Rede von "vorsichtig sein" oder "im Begriff zu töten". Das kann sein, was momentan passiert, aber ist es das gleiche in iOS5? Oder in späteren Versionen? Es ist ziemlich gefährlich solche Annahmen zu treffen.

Ich denke, Sie müssen überlegen, Ihre Speichernutzung zu optimieren. Es gibt fast immer eine Möglichkeit, Bilder zu optimieren, Cache / Zwischendaten zu veröffentlichen, Autorelease-Pools effizienter zu nutzen, kleinere / effizientere Datenstrukturen. Sie sagen nicht, welche Techniken Sie gerade verwenden, daher ist es schwierig, spezifisch zu sein.

    
Stephen Darlington 28.09.2011 12:18
quelle
0

Ein alternativer Ansatz, den ich NICHT VERSUCHT habe, aber vielleicht funktioniert: Erfasse die Ausgabe von Apples Systemlogger (ASL), suche nach der lev2-Warnzeichenfolge.

Unter der Annahme, dass Apple tatsächlich die ASL verwendet (was sie möglicherweise nicht sind!), könnten Sie versuchen, den Anweisungen hier zu folgen: Ссылка - welche zeigen, wie man mit öffentlichen APIs von Apple auf die ASL zugreift.

    
Adam 03.07.2013 22:09
quelle

Tags und Links