使用 NSUserDefaults 杀死应用程序后保存的数据丢失

Posted

技术标签:

【中文标题】使用 NSUserDefaults 杀死应用程序后保存的数据丢失【英文标题】:Saved data lost after kill app using NSUserDefaults 【发布时间】:2012-07-16 14:40:42 【问题描述】:

我在我的设置中使用 NSUserDefaults。即使我按主页键让应用程序进入后台,应用程序也能正常工作,但如果我终止应用程序,保存在 NSUserDefaults 中的数据将会丢失。这是我的代码。我有使用同步。 第一次初始化:

 if (![userDefaults integerForKey:
          kORFootageAirPlayModeKey])
    
        [userDefaults setInteger:TRUE forKey:kORFootageAirPlayModeKey];
    
    [userDefaults synchronize];

在 viewController 中读取值:

airPlayMode = [[NSUserDefaults standardUserDefaults]integerForKey:kORFootageAirPlayModeKey];

在动作中设置它:

- (IBAction)changeAirPlayStatus:(id)sender


    if (sender)
    
        airPlayMode = [sender tag];

        [[NSUserDefaults standardUserDefaults] setInteger:airPlayMode forKey:kORFootageAirPlayModeKey];
        [[NSUserDefaults standardUserDefaults] synchronize];
    
.....

【问题讨论】:

【参考方案1】:

确保您的数据得到保存的最佳方法是在您的应用程序委托中的applicationWillTerminate:applicationWillResignActive: 中包含对-synchronize 的调用。

编辑:

此外,steipete 关于使用 setInteger:TRUE 的 cmets 是准确的 - 请改用 setBool:YES。

【讨论】:

【参考方案2】:

我看不出有什么原因。

您是否检查了 Simulator 目录,在 Library/Caches 下有保存 NSUserDefaults 的 plist。检查是否写对了。

请不要使用 setInteger:TRUE。这在很多层面上都是错误的。请改用 setBOOL:YES。或 setInteger:1。

【讨论】:

将 setInteger 更改为 setBOOL 后,一切正常。所以强制转换让ios疯狂。 plist 文件的位置在:/Users/apple/Library/Application Support/iPhone Simulator/5.1/Applications/xxxx-xxxxx-xxxxx/Library/Preferences/com.yourappname.plist

以上是关于使用 NSUserDefaults 杀死应用程序后保存的数据丢失的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:在应用程序被杀死时保留 NSUserDefaults 值

在模拟器上卸载应用程序后,NSUserDefaults未清除

技术 NSUserDefaults的使用

Obj C - 加载视图后,NSUserDefaults 不会返回要计算的值

如何使用 NSUserDefaults 和 NSDateComponent 来存储?

NSUserDefaults设置bool值重新启动后bool仅仅设置丢失问题