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

3
换句话说,我必须在应用程序的一个位置(例如启动时)调用registerDefaults吗?还是可以根据需要注册默认值?
如果是添加性的,当我尝试覆盖一个值时会发生什么?
例如,给定以下代码...
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"a": @1}];
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"b": @2}];
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"b": @3}];

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

  1. @{@"b": @3}(替换)
  2. @{@"a": @1, @"b": @3}(添加,覆盖值)
  3. @{@"a": @1, @"b": @2}(添加,不覆盖值)
  4. 崩溃,因为@"b"已经定义了。
1个回答

3
  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}

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

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


3
registerDefaults 不会覆盖真实值。显式设置的值始终优先于默认值。只有在没有显式设置任何值时,才会返回默认值。 - rmaddy
是的,乍一看这个答案有点误导性。例如,如果你使用[[NSUserDefaults standardUserDefaults] setInteger: 3 forKey: @"b"]来代替第二个“b” registerDefaults调用,然后再调用registerDefaults将“b”的值更改为其他值,输出中仍会保留3 - shim
尽管从技术上讲,答案并不是不准确的。 - shim
1
这个问题/答案完全是关于registerDefaults,没有提到也没有调用setInteger或其他任何set方法。这是关于理解registerDefaults如何工作的。 - Senseful

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接