NSUserDefaults无法正常工作

sud*_*-rf 4 iphone cocoa-touch objective-c nsuserdefaults

NSUserDefaults这里遇到一些麻烦.

这就是我创建它的方式:

NSString *theCity = @"Test City";
[[NSUserDefaults standardUserDefaults] setObject:theCity forKey:@"SavedCity"];
Run Code Online (Sandbox Code Playgroud)

这是我试图检索它的方式:

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"SavedCity"])  
    {
         NSLog(@"Key exists! %@",[[NSUserDefaults standardUserDefaults] objectForKey:@"SavedCity"]);
    }
    else {
         NSLog(@"No city saved!");
    }   
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,即使有一个"SavedCity"键(我检查模拟器目录中的pref文件),它总是显示"No city saved".难道我做错了什么?

谢谢!

Ale*_*ers 10

你可以尝试两件事.

1)在设置字符串后尝试同步用户默认值. [[NSUserDefaults standardUserDefaults] synchronize]

2)尝试使用检索字符串 -stringForKey:

  • 请不要建议使用-synchronize调用来修复NSUserDefaults问题.它非常慢,阻止每个线程触及默认系统,并且*几乎从不*有用,特别是在iOS上.显式同步的主要用途是处理其他默认域(全局首选项,其他应用程序的首选项等). (14认同)

pwc*_*pwc 8

我最近遇到了类似的问题.这是为我修复它的原因.

iOS应用程序编程指南:

除了将它们包含在设置包属性列表中之外,建议您在启动时以编程方式注册任何默认首选项值.对于新安装的应用程序,在设置应用程序运行之前,不会设置应用程序设置包中的默认首选项值.这意味着如果用户在运行"设置"之前运行您的应用程序,则设置包中指定的默认值将不可用.在启动时以编程方式设置此类值可确保应用程序始终具有适当的值.要以编程方式注册默认值,请使用类的registerDefaults:方法NSUserDefaults.