-[NSUserDefaults registerDefaults:] 是附加的,它会覆盖值吗?

Posted

技术标签:

【中文标题】-[NSUserDefaults registerDefaults:] 是附加的,它会覆盖值吗?【英文标题】:Is -[NSUserDefaults registerDefaults:] additive and does it overwrite values? 【发布时间】:2015-03-10 21:14:23 【问题描述】:

换句话说,我必须只在我的应用程序的一个位置(例如启动时)调用registerDefaults,还是可以根据需要注册默认值?

如果它是加法的,当我尝试覆盖一个值时会发生什么?

例如,给定以下代码...

[[NSUserDefaults standardUserDefaults] registerDefaults:@@"a": @1];
[[NSUserDefaults standardUserDefaults] registerDefaults:@@"b": @2];
[[NSUserDefaults standardUserDefaults] registerDefaults:@@"b": @3];

...最终的默认字典是什么?

    @@"b": @3(替换) @@"a": @1, @"b": @3(加法,覆盖值) @@"a": @1, @"b": @2(加法,不要覆盖值) 崩溃,因为 @"b" 已定义。

【问题讨论】:

【参考方案1】:
    它是加法,并且覆盖值。

例子:

[[NSUserDefaults standardUserDefaults] registerDefaults:@@"a": @1];
[[NSUserDefaults standardUserDefaults] registerDefaults:@@"b": @2];
[[NSUserDefaults standardUserDefaults] registerDefaults:@@"b": @3];
NSAssert([[NSUserDefaults standardUserDefaults] integerForKey:@"a"] == 1, @"");
NSAssert([[NSUserDefaults standardUserDefaults] integerForKey:@"b"] == 3, @"");

终极词典是:

@@"a": @1, @"b": @3

因此,您可以根据需要多次调用它。

来自documentation:

将指定字典的内容添加到注册域。

【讨论】:

registerDefaults 不会覆盖实际值。显式值始终优先于默认值。仅当未设置显式值时才返回默认值。 是的,这个答案乍一看有点误导,例如如果您执行[[NSUserDefaults standardUserDefaults] setInteger: 3 forKey: @"b"] 而不是第二个“b”registerDefaults 调用,然后调用registerDefaults 将“b”的值更改为其他值,则输出中将包含3 虽然从技术上来说答案并非不准确。 这个问题/答案都是关于registerDefaults 的,而setInteger 也没有提到或调用任何其他set 方法。这是关于了解registerDefaults 的工作原理。

以上是关于-[NSUserDefaults registerDefaults:] 是附加的,它会覆盖值吗?的主要内容,如果未能解决你的问题,请参考以下文章

将UIColor保存到NSUserDefaults并从NSUserDefaults加载

NSUserDefaults 不可靠?

何时(不)滥用 NSUserDefaults

首选项(NSUserDefaults)崩溃?

iOS之NSUserDefaults的用法

NSUserDefaults读取和写入自定义对象