我正在开发一款能够“添加到书签/收藏夹”的iphone应用程序
但是这些书签中的每一个都有一个“状态”字幕或字段,“状态”在打开的jSon数据库中不断更新,因此在书签表视图中,当用户点击“更新”按钮时,它会发送向服务器发出请求并为每个书签提取最新的“状态”。
然后当用户点击其他视图时,它会将所有新状态保存到userDefault中,我是通过在“viewWillDisappear()”中执行以下操作来完成的:
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:myObject forKey:@"myServiceList"];
[defaults synchronize];
以上工作正常,数据已保存。
但是当我回到书签视图,然后再次点击其他视图时,它会崩溃!它不会通过以下代码行(所以它在第一次工作,但不是第二次):
[myDict setObject:[myService objectForKey:@"status"] forKey:@"status"];
在查看userDefault API之后,我尝试添加以下代码行来解决问题,并且它完美运行!
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:myObject forKey:@"myServiceList"];
[defaults synchronize];
//I added the following
[NSUserDefaults resetStandardUserDefaults];
即使它解决了我的问题,但我并没有真正理解它如何解决它,文档说它“同步对共享用户默认对象所做的任何更改并从内存中释放它。”
这是否意味着我的“myServiceList”正在使用中,我必须先从内存中释放它才能再次使用它?
有人可以帮我理解这个问题吗?
谢谢!
编辑: 这是我的书签视图的viewWIllDisappear(),如果我从书签视图切换到其他视图,它会没问题,然后当我回到书签视图并再次切换到其他视图时,它会崩溃:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"start saving data");
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray * defaultArray = [[defaults objectForKey:@"myServiceList"] mutableCopy];
for (NSString *key in self.tableContents)
{
for(NSMutableDictionary *myService in [tableContents objectForKey:key])
{
for(NSMutableDictionary *myDict in defaultArray)
{
if([[myDict objectForKey:@"serviceNumber"] isEqualToString:[myService objectForKey:@"serviceNumber"]])
{
//The following line is where it will crash
[myDict setObject:[myService objectForKey:@"status"] forKey:@"status"];
NSLog(@"updated");
break;
}
}
}
}
[defaults setObject:defaultArray forKey:@"myServiceList"];
[defaults synchronize];
//[NSUserDefaults resetStandardUserDefaults];
}
答案 0 :(得分:0)
我认为发生的事情是,通过使用resetStandardUserDefaults,你强制刷新内存,包括序列化myObject。
我敢打赌,如果你没有从内存中刷新它,那么standardUserDefaults的内存中副本会尝试返回你为密钥" myServiceList"提供的原始myObject。
如果您追踪事物,我怀疑原始myObject已经被破坏或被删除。
通过强制它为你提供一个新的myObject,从磁盘反序列化,你没事。
您可以通过挂在myObject的另一个副本上来检查这一点,在您调用resetStandardUserDefaults的位置,然后将其与您获取的键的值进行比较" myServiceList"后面。