resetStandardUserDefaults真正做了什么?

时间:2012-08-20 14:51:57

标签: iphone objective-c ios nsuserdefaults

我正在开发一款能够“添加到书签/收藏夹”的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];
}

1 个答案:

答案 0 :(得分:0)

我认为发生的事情是,通过使用resetStandardUserDefaults,你强制刷新内存,包括序列化myObject。

我敢打赌,如果你没有从内存中刷新它,那么standardUserDefaults的内存中副本会尝试返回你为密钥" myServiceList"提供的原始myObject。

如果您追踪事物,我怀疑原始myObject已经被破坏或被删除。

通过强制它为你提供一个新的myObject,从磁盘反序列化,你没事。

您可以通过挂在myObject的另一个副本上来检查这一点,在您调用resetStandardUserDefaults的位置,然后将其与您获取的键的值进行比较" myServiceList"后面。