2012-02-06 107 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