2012-02-06 127 views
5

當我建立我的應用程序默認的喜好,我做了以下內容:爲什麼使用registerDefaults:而不是setValue:forKey:?

1)閱讀Root.plist從內部Settings.bundle到字典中。

2)我測試,如果偏好設置,如果沒有我通過[NSUserDefaults standardUserDefaults] registerDefaults:]

問題註冊我的默認詞典,與registerDefaults:註冊默認不要去持久存儲,所以如果用戶從未更改他們的偏好我正在閱讀我的默認偏好,並在每次應用啓動時用NSUserDefaults註冊。

而不是使用registerDefaults:我可以使用setValue:forKey:並將我的默認設置轉到永久存儲,繞過每個啓動時需要構建&註冊字典。但是,Apple的documentationsample code都指向registerDefaults:

所以我想弄清楚什麼時候和爲什麼我應該使用registerDefaults:以及何時/爲什麼我應該使用setValue:forKey:來代替?

+1

我發現這個相關的問題:[[NSUserDefaults registerDefaults:]?](http://stackoverflow.com/questions/4931167/what-is-the-use-of-nsuserdefaults-registerdefaults)雖然答案解釋了這些差異,但他們仍然沒有真正說出爲什麼你應該使用一個。 (答案似乎忽略了我關於持久性的問題。) – gabrielk 2012-02-06 20:05:18

回答

5

問題是,與registerDefaults註冊默認:不要去持久存儲,所以如果用戶永遠不會改變自己的喜好,我讀我的默認的喜好和NSUserDefaults的與每一次註冊它們的應用程序啓動。

是的。爲什麼這是一個問題?爲什麼要在代碼中寫入磁盤中的東西?

而不是使用registerDefaults的:我可以使用的setValue:forKey:和有我的默認設置到持久性存儲,繞過需要建立&登記在每次發射的字典。但是,Apple的文檔和示例代碼都指向registerDefaults :.

只有當您第一次選中「是否設置此值?否?好,現在設置它。」這比使用registerDefaults:更符合代碼和成本。

您應該使用registerDefaults:來設置默認值。您應該使用setValue:forKey:來保存活動設置的值。

還記得NSUserDefaults也存在於Mac上。在那裏,用戶可以使用defaults命令直接訪問設置,因此程序不是唯一可以修改此存儲的實體。

+0

我想這不是問題,它看起來非常多餘。如果我設置了默認值,並且用戶不喜歡它們,他可以更改它們,並保存更改...並且仍然需要設置默認值。同樣,如果用戶對默認值感到滿意,並且沒有理由保存它們,我仍然需要設置默認值。我更願意保存默認值,因爲存儲的默認值會被用戶覆蓋。我仍然沒有看到使用registerDefaults的真實案例: – gabrielk 2012-02-06 20:38:00

+0

這對我來說尤其奇怪,因爲我想要的默認值存儲在Settings.bundle .plist文件中,但它們不被用作實際的默認值(更像是提示顯示選項時的GUI?)。 – gabrielk 2012-02-06 20:40:59

+1

除了需要更多代碼來存儲商店中的默認值(因爲您首先必須測試它們是否已設置)之外,將它們保存到商店使得在將來的升級中不可能更改默認值,並且浪費如果在升級過程中刪除設置,則爲空格。但是「更多的代碼來檢查所有的默認值,然後設置它們」對於'registerDefaults:'的開發者來說真的是最大的勝利。 – 2012-02-06 20:42:02

相關問題