2010-11-13 41 views
7

我在對象的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]調用。這讓我有點緊張,但我把這個信任放在蘋果身上。 :)

回答

7

這很糟糕,因爲在調用-dealloc時,其他對象已經放棄了對它的興趣。這可能有很多不同的含義。

設置用戶默認值的更好的地方是設置更改的瞬間。這樣一來,它就會立即被保留下來,並且應用程序可以被殺死,不用擔心設置不會被保留,因爲對象圖的某些部分可能已經消失。

0

同步用戶在-dealloc中的默認值與其他地方沒有什麼不同。這是因爲,雖然看起來很瘋狂,但是-dealloc並不是什麼神奇的東西,與C++析構函數不同,-dealloc其實就是一個典型的方法。你可能會稍微擔心將self.filenamesArray傳遞給userDefualts,因爲那實際上是可能超過實際釋放的東西,但我相信用戶默認會保留它。

至於你應該什麼時候應該[userDefaults synchronize];,人們會有所不同,我個人不同意@Joshua--我從不顯式地同步,而是讓NSUserDefaults來處理它。除非我非常誤解,否則會在應用程序關閉時自動啓動,除此之外會定期進行。由於它知道它何時被更新,並且需要一次性寫完整個plist文件,所以我認爲我寧願讓蘋果的algos在處理默認值的時候處理,因爲它需要花費不小的時間(因爲它寫入文件系統)。

(請注意,如果你有你的周圍用戶默認值,特殊情況沒有最後一段的應用,如其他應用程序讀取/寫入它們)

+0

我賈裏德同意,'synchronize'應該只被用於「力「同步。這在調試時很有用,並且有可能發生崩潰等。 – mohsenr 2010-11-13 23:38:49

+0

我不記得任何人將-dealloc表示爲「神奇」的。重點在於它通常是不好的做法,因爲你的對象圖的這部分被拆除。除了拆除以外的任何其他操作(例如從通知中心刪除自己等)會創建一個應用程序的更多區域,隨着您的類變得越來越複雜,這可能會導致錯誤。特別是當你考慮對其他對象的弱引用時,這個對象的-dealloc被調用時可能已經過去了。現在的代碼看起來無害,但這很容易改變。 – 2010-11-13 23:38:56

+0

上面說(用完了房間),我同意調用-synchronize是不必要的,但是設置用戶默認是我主要遇到的問題。 OP不只是調用同步,他正在等待在-dealloc調用期間設置默認值。我改變了我原來的答案,以反映這種區別。 – 2010-11-13 23:41:16

相關問題