-[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:] 是附加的,它会覆盖值吗?的主要内容,如果未能解决你的问题,请参考以下文章