我在對象的init方法中從NSUserDefaults加載。 我可以在我的對象的dealloc方法中保存到NSUserDefaults嗎?在 - (void)dealloc中同步NSUserDefaults是不是很糟糕?
東西一模一樣:
-(void)dealloc {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:self.filenamesArray forKey:self.defaultsKey];
[userDefaults synchronize];
self.filenamesArray = nil;
self.defaultsKey = nil;
[super dealloc];
}
好的,壞的,好不好?如果不好,哪裏會更好。
編輯:
感謝您的詳細回覆。所有這些都是有道理的。我發現另一個原因是爲什麼這是一個保存到用戶默認設置的不好的地方,因爲dealloc只有在一個對象很好地釋放時才被調用。如果我的應用程序被殺害,這段代碼從不運行。同樣,如果應用程序被推入後臺(iOS 4),則不會運行。 我也刪除了明確的[userDefaults synchronize]
調用。這讓我有點緊張,但我把這個信任放在蘋果身上。 :)
我賈裏德同意,'synchronize'應該只被用於「力「同步。這在調試時很有用,並且有可能發生崩潰等。 – mohsenr 2010-11-13 23:38:49
我不記得任何人將-dealloc表示爲「神奇」的。重點在於它通常是不好的做法,因爲你的對象圖的這部分被拆除。除了拆除以外的任何其他操作(例如從通知中心刪除自己等)會創建一個應用程序的更多區域,隨着您的類變得越來越複雜,這可能會導致錯誤。特別是當你考慮對其他對象的弱引用時,這個對象的-dealloc被調用時可能已經過去了。現在的代碼看起來無害,但這很容易改變。 – 2010-11-13 23:38:56
上面說(用完了房間),我同意調用-synchronize是不必要的,但是設置用戶默認是我主要遇到的問題。 OP不只是調用同步,他正在等待在-dealloc調用期間設置默認值。我改變了我原來的答案,以反映這種區別。 – 2010-11-13 23:41:16