Ios 不稳定的行为

Ios 不稳定的行为,ios,nsuserdefaults,Ios,Nsuserdefaults,我能知道NSUserDefaults的具体工作原理吗? 我用它来维护用户信息,比如用户名。 在一个控制器中,我设置: NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setObject:@"xyz" forKey:@"username"]; 在另一个例子中,我将其检索为: NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

我能知道
NSUserDefaults
的具体工作原理吗? 我用它来维护用户信息,比如用户名。 在一个控制器中,我设置:

 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
 [prefs setObject:@"xyz" forKey:@"username"];
在另一个例子中,我将其检索为:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

username = [prefs stringForKey:@"username"];

它有时工作,但有时
setobject
不设置任何内容(
username=[prefs stringForKey:@“username”]
给我
nil
。有时它工作得很好。我认为这是一个持久存储,所以我不确定发生了什么。这是在模拟器中,因为我还没有机会在手机上测试它。

这就是Mac开发者库所说的默认设置

NSUserDefaults类提供与默认系统交互的编程接口。默认系统允许应用程序自定义其行为以匹配用户的首选项。例如,您可以允许用户确定应用程序显示的度量单位或自动保存文档的频率。应用程序通过将值分配给用户的默认数据库中的一组参数来记录此类首选项。这些参数称为默认值,因为它们通常用于确定应用程序启动时的默认状态或默认操作方式

在运行时,您可以使用NSUserDefaults对象从用户的默认值数据库读取应用程序使用的默认值。NSUserDefaults缓存信息,以避免每次需要默认值时都必须打开用户的默认值数据库。同步方法,该方法在定期间隔时间自动调用VAL,使内存缓存与用户的默认数据库保持同步

NSUserDefaults类为访问常见类型(如浮点、双精度、整数、布尔值和URL)提供了方便的方法。默认对象必须是属性列表,即的实例(或集合实例的组合):NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary。如果要存储任何其他类型的对象,通常应将其存档以创建NSData实例。有关详细信息,请参阅《首选项和设置编程指南》

即使将可变对象设置为值,从NSUserDefault返回的值也是不可变的。例如,如果将可变字符串设置为“MyStringDefault”的值,则稍后使用stringForKey:检索的字符串将是不可变的

将为每个用户自动创建默认数据库。NSUserDefaults类当前不支持每主机首选项。为此,必须使用CFPreferences API(请参阅首选项实用程序参考)。但是,NSUserDefaults会正确读取每个主机的首选项,因此您可以安全地将CFPreferences代码与NSUserDefaults代码混合使用

如果您的应用程序支持托管环境,您可以使用NSUserDefaults对象来确定哪些首选项是由管理员为用户管理的。托管环境对应于管理员或教师可能希望以特定方式配置系统的计算机实验室或教室。在这些情况下在默认情况下,教师可以建立一组默认首选项并强制用户使用这些首选项。如果以这种方式管理首选项,应用程序应通过禁用任何适当的控件来阻止用户编辑该首选项

而不是像你现在这样做

并使用

  NSLog(@"%@",[NSUserDefaults standardUserDefaults] objectForKey:@"username"]);

当您存储此用户名时?我建议在设置首选项后立即添加NSLog,如:NSLog(@“%@,[prefs dictionaryRepresentation]),然后在读取pref之后放置相同的日志,如果它是nil。这样,您可以在您关心的两个点上比较默认值的内容。我打赌您在第一次调用之后的某个时间,但在第二次调用之前,自己将该键设置为nil。嗯,从这个问题也不清楚这是在进程的一次运行中,还是在ross多次运行。如果是后者,-synchronize实际上可能是一个有效的答案。这不是因为程序中需要它,而是因为在Xcode中单击stop会异常终止程序,所以它没有机会保存。
  NSLog(@"%@",[NSUserDefaults standardUserDefaults] objectForKey:@"username"]);