iOS:当应用程序终止时,NSDefault 不会保存/加载
Posted
技术标签:
【中文标题】iOS:当应用程序终止时,NSDefault 不会保存/加载【英文标题】:iOS: NSDefault Will Not Save / Load When App Terminates 【发布时间】:2013-06-25 23:43:34 【问题描述】:尊敬的专家和朋友,
嗨,我一整天都在努力解决这个问题,但我尝试过的任何方法似乎都不起作用。基本上我想使用 NSDefault 保存一个字符串数组(最大:20,没有重量)。它保存,加载正常,但当我通过按下减号按钮在真实设备上杀死应用程序时没有。我在 iPhone 4gs (ios 6) 上对其进行了测试。
我试过 [[NSUserDefaults standardUserDefaults] synchronize];
in both
applicationWillTerminate:(UIApplication *)application
and
applicationDidEnterBackground:(UIApplication *)application
但它没有用。
注意:从 NSLog 中,只要我不在真实设备的后台杀死应用程序,我就可以从 NSDefault 中恢复正常值。
有人知道为什么吗?提前谢谢了。请附样本。
========================== 编辑(添加代码):
我正在添加一些代码,希望它会更清晰,并且有人可以在这里真正帮助我。
提前致谢。 一些动作,然后
self.count = [NSNumber numberWithInt:[self.count intValue] + 1];
count is a NSNumber
NSData *count = [NSKeyedArchiver archivedDataWithRootObject:self.count];
[[NSUserDefaults standardUserDefaults] setObject:count forKey:@"count"];
[[NSUserDefaults standardUserDefaults] synchronize];
arrayForSavedKey is a NSMutableArray
[[NSUserDefaults standardUserDefaults] synchronize];
NSData *array = [NSKeyedArchiver archivedDataWithRootObject:self.arrayForSavedKey];
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"arrayForSavedKeys"];
在两者中: applicationWillResignActive:(UIApplication *)application
applicationWillEnterBackground:(UIApplication *)application
我已尝试添加以下行 [[NSUserDefaults standardUserDefaults] 同步]; 为了检索数据,我让委托调用 A 类中的方法 通过调用: 加载保存数据 并像这样取消归档:
NSData *savedKeys = [[NSUserDefaults standardUserDefaults] objectForKey:@"arrayForSavedKeys"];<br>
NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:savedKeys]];<br>
self.arrayForSavedKey = [[NSMutableArray alloc] initWithArray: array];<br>
(里面只有几个NSString)
我在其中 NSLOG 输出并且一切都很好,只要我没有通过减号杀死应用程序。 (但是使用真实设备时,我当然无法从 NSLog 中看到任何内容,因为一旦我杀死了 App,App 也会在 xCode 中停止运行)
我今天已经度过了一整天,我正在竭尽全力。请帮忙。
【问题讨论】:
【参考方案1】:applicationWillTerminate:
只在一些非常特殊的情况下调用,所以不要费心使用它。
使用applicationWillEnterForeground:
保存默认设置为时已晚。
调用[[NSUserDefaults standardUserDefaults] synchronize];
的正确位置是在applicationDidEnterBackground:
方法中。这样,如果您的应用在后台被杀死,则默认值已经保存。
【讨论】:
使用调试器(或NSLog
语句),您是否验证了当您的应用进入后台时正在调用synchronize
?以上是关于iOS:当应用程序终止时,NSDefault 不会保存/加载的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序在后台或终止时,iOS 设备不会推送通知。导航到下一个屏幕在 Flutter 的 IOS 设备中也不起作用?
当用户点击应用程序图标上的红色 (-) 按钮时,应用程序强制终止回调