使用 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未清除
Obj C - 加载视图后,NSUserDefaults 不会返回要计算的值