2011-01-10 18 views
2

Also habe ich viel darüber gelesen, wie iOS Anwendungsstatusbenachrichtigungen handhabt, und es sieht so aus, als hätten sie ein Problem für iOS 4 geschaffen.(iOS 4.x) Löschen der NSUserDefaults beim Beenden der App

Vor 4.x habe ich meine NSUserDefaults in der - (void)applicationWillTerminate:(UIApplication *)application {} Delegiertenmethode gereinigt.

Leider sieht es nicht so aus, als ob diese Methode mehr benutzt wird, wenn der Benutzer die App vom Desktop aus beendet (indem er das rote "-" drückt). Stattdessen erhält die App ein SIGKIL. Hat jemand einen Weg geplant, dies zu erfassen und etwas zu tun, wenn die App beendet wird (z. B. die UserDefaults ausräumen)? Ich würde es vorziehen, das Multitasking nicht zu deaktivieren, da dies ein nicht standardmäßiges Verhalten ist. Jede Hilfe würde geschätzt werden. Vielen Dank!

Antwort

3

Diese Methode wird immer noch gesendet, wenn iOS jemals beschließt, die App zu beenden. Sie sollten wahrscheinlich den gleichen Bereinigungscode in applicationWillResignActive: setzen, wenn Sie möchten, dass er auch aufräumt, wenn er in den Hintergrund wechselt.

Wenn Sie jedoch sagen, dass Sie Multitasking unterstützen möchten, warum löschen Sie den Standard? Sollte der Benutzer nicht genau so zur App zurückkehren können, wie er sie verlassen hat?

+0

Das ist genau mein Punkt. Ich möchte es nur löschen, wenn die App vollständig beendet ist. Es sollte in der Lage sein, noch im Hintergrund zu laufen und bei Bedarf wieder aufzunehmen ... – gabaum10

+0

Ich überlegte meine Datenstrukturen neu, um dieses Problem zu bewältigen und ging mit diesem Weg. Danke für die Hilfe. : D – gabaum10

0

Mit "bereinigen" meinen Sie "auf Platte synchronisieren"? (d. h. durch Aufruf von -synchronize)

Wenn dies der Fall ist, erledigt NSUserDefaults dies automatisch für Sie, ohne dass Sie sich darum kümmern müssen.

+0

Synchronisierung wird regelmäßig ausgeführt, es gibt jedoch keine Garantie, dass sie aufgerufen wird, bevor Ihre App beendet wird. –

+0

Wenn Ihre Anwendung nicht unerwartet beendet wird (d. H. Als Reaktion auf Speicherdruck oder aufgrund eines Absturzes), werden ihre Einstellungen während der Beendigung synchronisiert. Wenn es sich nicht um eine dokumentierte Garantie handelt, sollte es (möglicherweise lohnt sich, einen Fehler zu melden, wenn ja). Auch "periodisch" ist nicht ganz die richtige Formulierung. Es ist ein Koaleszenzintervall, nachdem eine Voreinstellung festgelegt wurde. –

+0

Nein, ich möchte nicht synchronisiert werden. Ich möchte einige Inhalte entfernen, die ich nicht vor dem Schließen der App speichern möchte. Ich konnte das vor 4.x in der 'applicationWillTerminate' Methode machen. Aber das wird nicht mehr aufgerufen ... – gabaum10

0

Sie benötigen den Code in applicationWillTerminate: für die iOS 4-Geräte, die Multitasking nicht unterstützen. Aber Sie müssen auch den gleichen Code aufrufen, wenn die App in den Hintergrund tritt (applicationDidEnterBackground :). Sie könnten auch applicationWillResignAktiv: in Erwägung ziehen, aber dies würde beim Eintreffen eines Anrufs oder einer SMS angerufen werden und nicht nur, wenn es in den Hintergrund tritt.

+0

Siehe meine Antwort auf BobDevil's Antwort. Ich möchte nichts damit anfangen, wenn es in den Hintergrund tritt ... – gabaum10

+0

In diesem Fall ist Ihre einzige Option, das Multitasking ('UIApplicationExitsOnSuspend') zu deaktivieren, da es keine Möglichkeit gibt, das" Kill "abzufangen, wenn Ihre App ist im Hintergrund. –

+0

Ah Mann, das ist ein Ball Buster. Es gibt keine Möglichkeit, eine Benachrichtigung einzurichten, die auf die SIGKIL-Nachricht wartet. – gabaum10

Verwandte Themen