有什么用 - [NSUserDefaults registerDefaults:]?

Enr*_*tyo 66 iphone cocoa-touch nsuserdefaults

有什么区别:

[[NSUserDefaults standardUserDefaults] registerDefaults:
  [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];
Run Code Online (Sandbox Code Playgroud)

还有这个:

[[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"];
Run Code Online (Sandbox Code Playgroud)

Luc*_*uke 82

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

因此,如果您想提供一个名为"欢迎消息"的"属性",那么您可以在不存在属性的情况下返回nil插入默认消息"欢迎首次使用者",该消息将在没有时显示更改属性.

这将简化您的逻辑,因为您不需要编写if测试来检查"属性"是否返回nil,然后在这种情况下发出另一条消息.

NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"];

if(greeting == nil) {
    NSLog(@"Welcome first-time user!");
}
Run Code Online (Sandbox Code Playgroud)

您发布的第二个代码段用于将属性设置为另一个值.您将使用不同的set方法(setString,setObject,setBoolean)来设置值,具体取决于Userdefaults中的程序状态.

编辑-----根据评论要求更新.

第一种方法是将值注册到默认值,顾名思义.第一次使用某个键名访问该属性时,对象的值为nil,布尔值为false,数字为0.如果没有在程序中设置值,然后执行某些"默认"操作(例如上面的示例),而不是执行大量测试等等,您可以使用这些键的一些已预定义的值发送应用程序.

registerDefaults的典型放置位置是appDelegate中的初始化方法.

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

把它想象成这样

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

  • 对,那是正确的.它将注册默认值的唯一时间是用户尚未为该属性设置其他值.当以后打开应用程序时,它不会覆盖用户存储的内容. (4认同)

onm*_*133 31

长话短说,

[[NSUserDefaults standardUserDefaults] setObject:@"Entropy" forKey:@"kName"]
Run Code Online (Sandbox Code Playgroud)

将"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"]);
Run Code Online (Sandbox Code Playgroud)

将打印"Mac OS X","Google",(null)

事实上, registerDefaults

  • 不保存到磁盘
  • 仅设置尚未设置的键的值("kOS"设置为setObject:forKey:"kSearchEngine"未设置)
  • 为标量值返回0,无用于如果该键被两个未设置对象registerDefaultssetObject:forKey:("kBrowser"在这种情况下)

和使用 registerDefaults

引自"首选项和设置编程指南"

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

引自如何使用NSUserDefaults保存数据

另一个提示是您可以使用预定义的NSDictionary对象初始化NSUserDefaults.因此,例如,您可以在用户有机会与您的程序进行交互之前将默认值设置为"false"或"true".在我的情况下,有时我会创建一个代表我游戏中所有关卡的数组,并在每个数组值中存储一个布尔值来检查玩家是否已经完成关卡.为此,我创建了数据对象,然后将其注册到NSUserDefaults.如果对象存在先前的值,则不会发生任何事情.否则,我的空白对象将被保存为"默认"默认值

PS:奥莱具有很好的文章,解释处理默认值NSUserDefaults的有了详细


Abi*_*ern 10

看待它的另一种方式就是这样.如果从〜/ Library/Preferences中删除首选项文件,则设置的默认值registerDefaults将是应用于应用程序的默认值,直到设置了新的首选项.