NSUserDefaults:+resetStandardUserDefaults 方法有啥用?如何提供“系统设置”?

Posted

技术标签:

【中文标题】NSUserDefaults:+resetStandardUserDefaults 方法有啥用?如何提供“系统设置”?【英文标题】:NSUserDefaults: What's the +resetStandardUserDefaults method good for? How can I provide "system settings"?NSUserDefaults:+resetStandardUserDefaults 方法有什么用?如何提供“系统设置”? 【发布时间】:2009-05-22 14:56:38 【问题描述】:

我希望用户能够做出一些偏好,比如颜色、偏好的图像等。 当我为此使用 NSUserDefaults 时,在应用程序的第一次启动时将没有首选项,对吗?所以,每次我想得到一个喜欢的偏好时

NSInteger avatarID = (NSInteger)[[NSUserDefaults standardUserDefaults] objectForKey:@"avatar"];

我必须检查它是否为空,然后使用我的系统偏好。但后来我在文档中看到了这一点:+resetStandardUserDefaults

是否有两个默认分支保存在某个地方?用户的,开发者的?

【问题讨论】:

【参考方案1】:

是的,但这与您正在做的事情有些不同。 NSUserDefaults 有 registerDefaults 方法,它可以让你从 NSDictionary 中用你提供的值填充“空白”默认值。把它放在你的应用控制器的 +initialize 方法中,你就会知道默认值是合理的。如果用户默认对象为某个键找到“真实”值,无论是您在当前应用程序启动期间设置的值还是从磁盘加载的值,它将始终优先于您在 registerDefaults 中提供的值。 resetStandardUserDefaults 将从内存中删除共享用户默认对象并撤消您对其所做的任何自定义,您不需要提供默认值。

另外,请记住,您不能将对象转换为原始的 NSInteger 值,您最终会得到一个表示对象指针内存位置的数字。要么使用 NSUserDefault 的 integerForKey: 直接获取原语,要么使用 objectForKey: 获取 NSNumber 并使用 integerValue 获取原语值。

【讨论】:

酷。所以在那个 NSDictionary 我会把我所有的系统默认设置。当用户想要更改它们时,我得到了 standardUserDefaults 对象,然后调用 objectForKey:... 将返回用户的默认值,如果该键没有,它会从该字典中获取它们吗?还是相反? 基本上,是的。 NSUserDefaults 实际上会查看多个搜索域,包括全局系统首选项、启动参数和您专门添加的自定义域。但在大多数情况下,您可以这样想,它会查找用户的设置,如果不存在则从默认字典中返回值。 你的意思是应用代理的 +initialize 方法?那会是正确的地方吗?或者它也可以在 -applicationDidFinishLaunching 中? 把它放在哪里并不重要,但是 +initialize 方法通常是最好的,因为通常可以保证在您可能需要访问某些默认值的其他方法之前调用它。

以上是关于NSUserDefaults:+resetStandardUserDefaults 方法有啥用?如何提供“系统设置”?的主要内容,如果未能解决你的问题,请参考以下文章

将UIColor保存到NSUserDefaults并从NSUserDefaults加载

NSUserDefaults 不可靠?

何时(不)滥用 NSUserDefaults

首选项(NSUserDefaults)崩溃?

iOS之NSUserDefaults的用法

NSUserDefaults读取和写入自定义对象