NSUserDefaults 并不总是保存我的 NSString 数据
Posted
技术标签:
【中文标题】NSUserDefaults 并不总是保存我的 NSString 数据【英文标题】:NSUserDefaults is not always saving my NSString data 【发布时间】:2012-01-27 00:51:32 【问题描述】:我遇到了一些令人费解的事情。我有一些基本的字符串数据正在尝试保存到 NSUserDefaults,如下所示:
NSString *state = @"finished";
[[NSUserDefaults standardUserDefaults] setObject:state forKey:@"downloadFinished"];
[[NSUserDefaults standardUserDefaults] synchronize];
当应用启动时,它决定加载哪个视图的方法之一是检查此用户设置的值:
NSString *savedState = [[NSUserDefaults standardUserDefaults] stringForKey:@"downloadFinished"]
if(savedState && [savedState length])
// Show view
每隔一段时间,我就会注意到该值无法加载,即使我确定该值之前已保存(或至少,该应用程序之前尝试过保存它)。发生这种情况时,当我从用户默认值中查找“downloadFinished”键时,我会得到一个 nil 值。
以前有人遇到过这种情况吗?是否有任何关于为什么会发生这种情况的知识?保存到用户的默认缓存和默认数据库失败的可能性有多大,有没有办法进一步防止这种情况发生?
我将尝试Why is NSUserDefaults not saving my values?中提到的解决方案,它会在应用进入后台时强制另一个同步,但我想知道是否有人对此有更深入的了解。
【问题讨论】:
这里不是解决方案,但为什么不为您的downloadFinished
键使用 BOOL 值?
您是否从您的 stringForKey: 调用中得到 nil 或空字符串?根据文档,nil 表示在 NSUserDefaults 中找不到密钥。
@MichaelDautermann the downloadFinished 是一个例子——我实际上是在尝试保存一个字符串。
@bneely 我得到了零回报。是的,我相信这是真的——没有找到密钥,这告诉我同步没有正确完成。
您是否在设备上、模拟器中或两者都复制过?
【参考方案1】:
我猜这里有一些数据类型问题。 你可以试试这个,看看有没有收获?
NSString *savedState = [[NSUserDefaults standardUserDefaults] objectForKey:@"downloadFinished"]
注意objectForKey用法
【讨论】:
我会试一试。如果它起作用,那么当 stringForKey 不起作用时,它涉及 objectForKey 会起作用。数据肯定保存为 NSString。以上是关于NSUserDefaults 并不总是保存我的 NSString 数据的主要内容,如果未能解决你的问题,请参考以下文章
无法保存到 iOS 7.0.2 上的 NSUserDefaults