有什么用 – ?

有什么区别:

[[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]]; 

和这个:

 [[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"]; 

不同之处在于,您注册的第一个代码片段默认将在用户未对“属性”进行任何更改时使用。

所以如果你想提供一个名为“欢迎消息”的密钥名称的“属性”,你可以不用让返回的属性插入默认消息“欢迎第一次使用”,当没有财产的变化。

这将简化您的逻辑,因为您不需要编写iftesting来检查“属性”是否返回nil,然后再发送另一条消息(如果是这种情况)。

 NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"]; if(greeting == nil) { NSLog(@"Welcome first-time user!"); } 

您发布的第二个代码片段用于将该属性设置为另一个值。 你将有不同的设置方法(setString,setObject,setBoolean)来设置取决于你的程序状态在Userdefaults中的值。

编辑—–根据要求更新评论。

第一种方法是将值注册为默认值,顾名思义。 第一次用某个键名访问属性时,对象的值为零,布尔值为false或数字为0。 而不是做很多的testing等等,所以如果程序中没有设置这些值,然后做一些“默认的”操作,比如上面的例子,那么你可以用一些已经为这些键预定义的值来运送你的应用程序。

一个典型的放置registerDefaults的地方是在appDelegate的初始化方法中。

然后在你的程序中的某个地方,你可能想要设置这些字段的值,然后你使用setObject,setString,setBoolean …和检索你使用stringForKey,objectForKey …

把它想成是这个

registerDefaults是可以为对象提供合理值的构造函数,否则你会得到一些我已经写过的默认值。 然后稍后如果你想改变对象的属性,你不要使用“构造函数”,而是使用set / get方法。

长话短说,

 [[NSUserDefaults standardUserDefaults] setObject:@"Entropy" forKey:@"kName"] 

将“Entropy”保存到Library / Preference文件夹中的一个名为com.example.Demo.plist的文件中(其中com.example.Demo是您的Bundle ID,请参阅IOS应用程序安全性第20部分 – 本地数据存储 )

 [[NSUserDefaults standardUserDefaults] setObject:@"Mac OS X" forKey:@"kOS"]; NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys: @"Windows", @"kOS", @"Google", @"kSearchEngine", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kOS"]); NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kSearchEngine"]); NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kBrowser"]); 

将打印“Mac OS X”,“Google”,(null)

实际上, registerDefaults

  • 不保存到磁盘
  • 只为未设置的键设置值(“kOS”由setObject:forKey:设置,未设置“kSearchEngine”)
  • 为标量值返回0,如果该键不是由registerDefaultssetObject:forKey:设置的,则为对象为零setObject:forKey:在本例中为“kBrowser”)

registerDefaults的用法

从首选项和设置编程指南引用

如果这些标准默认值不适合您的应用程序,则可以使用registerDefaults:方法注册您自己的默认值。 此方法将您的自定义默认值放置在NSRegistrationDomain域中,这会导致在未显式设置首选项时返回它们。

从如何使用NSUserDefaults保存数据引用

另一个技巧是你可以用一个预定义的NSDictionary对象来初始化你的NSUserDefaults。 例如,您可以在用户有机会与您的程序进行交互之前将默认值设置为“false”或“true”。 在我的情况下,有时候我会创build一个代表游戏中所有关卡的数组,并在每个数组中存储一个布尔值来检查玩家是否已经完成关卡。 为此,我创build数据对象,然后使用NSUserDefaults注册它。 如果以前的值存在的对象,然后没有任何反应。 否则,我的空白对象被保存为“默认”的默认值

PS: Ole有一篇非常好的文章,详细解释了如何使用NSUserDefaults处理默认值

看另一种方式是这样的。 如果您从〜/ Library / Preferences中删除了首选项文件, registerDefaults所设置的默认值将会被应用到应用程序,直到新的首选项被设置。

在Swift 2.1.1 Xcode 7.2中

我将这个片段添加到应用程序:didFinishLaunchingWithOptions来初始化tintColorsIndex,这是用户可以在应用程序中更改的参数之一。

  let defaults = NSUserDefaults.standardUserDefaults() defaults.registerDefaults([ "tintColorsIndex" : -1, ]) 

当应用程序启动时,第一次tintColorsIndex将被赋值-1(一个Int)。 如果用户在使用应用程序的时候改变了颜色,他们的偏好在随后的启动时不会被覆盖。

用户默认值被分组到域中… registerDefaults用于将默认值添加到注册域..

您可以在首选项和设置编程指南中阅读有关域的信息。