2010-11-13 7 views
7

Ich lade von NSUserDefaults in meinem Objekt init-Methode. Kann ich in der Dealloc-Methode meines Objekts in NSUserDefaults speichern? genauIst es eine schlechte Form, NSUserDefaults in - (void) dealloc zu synchronisieren?

etwas wie:

-(void)dealloc { 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:self.filenamesArray forKey:self.defaultsKey]; 
    [userDefaults synchronize]; 
    self.filenamesArray = nil; 
    self.defaultsKey = nil; 
    [super dealloc]; 
} 

gut, schlecht, ok? wenn es nicht gut ist, wo wäre es besser.

Bearbeiten:

Vielen Dank für die detaillierten Antworten. All diese Dinge ergeben Sinn. Ein weiterer Grund, warum ich herausgefunden habe, dass dies ein schlechter Platz zum Speichern von Benutzereinstellungen ist, besteht darin, dass Dealloc nur aufgerufen wird, wenn ein Objekt gut zugeordnet wird. Wenn meine App beendet wird, wird dieser Code nie ausgeführt. Wenn die App in den Hintergrund geschaltet wird (iOS 4), wird dies nicht ausgeführt. Ich habe auch den expliziten Aufruf [userDefaults synchronize] entfernt. Es macht mich ein wenig nervös, aber ich vertraue diesem Apfel auf Apfel. :)

Antwort

7

Es ist schlecht, weil zu der Zeit -dealloc aufgerufen wird, haben andere Objekte Interesse daran aufgegeben. Dies kann viele verschiedene Auswirkungen haben.

Der beste Ort zum Festlegen von Benutzereinstellungen ist der Moment, in dem sich eine Einstellung ändert. Auf diese Weise bleibt es sofort erhalten und die App kann gelöscht werden, ohne dass Sie befürchten müssen, dass eine Einstellung nicht beibehalten wird, da Teile Ihres Objektdiagramms möglicherweise bereits verschwunden sind.

0

Synchronisieren der Benutzer Standardeinstellungen in -dealloc ist nicht anders als irgendwo anders. Das liegt daran, dass, so verrückt es auch erscheinen mag, -dealloc in keiner Weise magisch ist, und anders als beispielsweise C++ - Destruktoren ist -dealloc eigentlich genau eine typische Methode. Sie könnten etwas beunruhigender sein, wenn Sie self.filenamesArray an userDefualts übergeben, da dies tatsächlich etwas ist, das über die tatsächliche Freigabe hinaus gehalten werden kann, aber ich vertraue darauf, dass der Benutzer diese Vorgabe beibehält.

Wann sollten Sie [userDefaults synchronize];, Menschen variieren, und ich persönlich stimme nicht mit @Joshua - ich nie explizit-synchronisieren, sondern lassen Sie NSUserDefaults kümmern sich darum. Wenn ich mich nicht sehr irre, wird es automatisch ausgelöst, wenn die App geschlossen wird, und auch sonst regelmäßig. Da es weiß, wann es aktualisiert wurde, und es muss die gesamte plist-Datei auf einmal schreiben, denke ich, dass ich lieber die Algos von Apple behandeln lassen würde, wenn es Zeit ist, die Standardwerte zu schreiben, da es nicht-triviale Zeit braucht schreibt in das Dateisystem).

(Beachten Sie, dass keines der letzten Absatz gilt, wenn Sie besondere Umstände haben Ihren Benutzervorgaben Umgebung, wie zum Beispiel eine andere Anwendung Lesen/Schreiben von ihnen)

+0

ich mit Jared zustimmen, 'synchronize' sollte nur verwendet werden, um„Kraft "Synchronisierung. Dies kann zum Beispiel beim Debuggen nützlich sein, und es besteht die Möglichkeit eines Absturzes usw. – mohsenr

+0

Ich kann mich nicht erinnern, dass jemand -dealloc als "magisch" präsentiert hat. Der Punkt ist, dass es in der Regel schlecht ist, besonders weil dieser Teil Ihres Objektgraphen abgerissen wird. Wenn Sie etwas anderes als das Abmelden tun (z. B. das Entfernen von Selbst aus einem Benachrichtigungscenter usw.), wird ein weiterer Bereich Ihrer Anwendung erstellt, der sich möglicherweise mit der Komplexität Ihrer Klasse verben könnte. Vor allem, wenn Sie schwache Referenzen zu anderen Objekten betrachten, die möglicherweise bereits durch die Zeit, zu der das Objekt -dealloc aufgerufen wird, auf Wiedersehen gegangen sind. Der Code, wie er jetzt aussieht, sieht harmlos aus, aber das könnte sich leicht ändern. –

+0

Das oben Gesagte (kein Platz mehr), ich stimme zu, dass der Aufruf zu -synchronize unnötig ist, aber das Festlegen der Benutzereinstellungen ist, was ich hauptsächlich das Problem habe. Das OP ruft nicht nur das Synchronisieren auf, sondern wartet darauf, die Standardeinstellungen während eines Dealloc-Aufrufs festzulegen. Ich habe den Wortlaut meiner ursprünglichen Antwort geändert, um diese Unterscheidung widerzuspiegeln. –