Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone resetStandardUserDefaults真正做什么?_Iphone_Objective C_Ios_Nsuserdefaults - Fatal编程技术网

Iphone resetStandardUserDefaults真正做什么?

Iphone resetStandardUserDefaults真正做什么?,iphone,objective-c,ios,nsuserdefaults,Iphone,Objective C,Ios,Nsuserdefaults,我正在开发一款iphone应用程序,它具有“添加到书签/收藏夹”的功能 但这些书签中的每一个都有一个“状态”字幕或字段,“状态”在打开的jSon数据库中不断更新,因此在书签表视图中,当用户单击“更新”按钮时,它会向服务器发送请求,并为每个书签提取最新的“状态” 然后,当用户单击另一个视图时,它会将所有新状态保存到userDefault中,我在“ViewWillEnglishe()”中执行了以下操作: 上述方法工作正常,数据已保存 但之后,当我回到书签视图,然后再次单击其他视图时,它将崩溃!它无法

我正在开发一款iphone应用程序,它具有“添加到书签/收藏夹”的功能

但这些书签中的每一个都有一个“状态”字幕或字段,“状态”在打开的jSon数据库中不断更新,因此在书签表视图中,当用户单击“更新”按钮时,它会向服务器发送请求,并为每个书签提取最新的“状态”

然后,当用户单击另一个视图时,它会将所有新状态保存到userDefault中,我在“ViewWillEnglishe()”中执行了以下操作:

上述方法工作正常,数据已保存

但之后,当我回到书签视图,然后再次单击其他视图时,它将崩溃!它无法通过以下代码行(因此它在第一次工作,但不是第二次):

在查看了UserDefaultAPI之后,我尝试添加以下代码行来解决这个问题,它工作得非常完美

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:myObject forKey:@"myServiceList"];
[defaults synchronize];
//I added the following
[NSUserDefaults resetStandardUserDefaults];
即使它解决了我的问题,但我不知道它是如何解决的,文档说它“同步对共享用户默认对象所做的任何更改,并将其从内存中释放。”

这是否意味着我的“myServiceList”正在使用中,我必须先从内存中释放它,然后才能再次使用它

有人能帮我理解这个问题吗

谢谢大家!

编辑: 这是我的书签视图的my ViewWillEnglish(),如果我从书签视图切换到其他视图,它会很好,然后当我返回书签视图并再次切换到其他视图时,它会崩溃:

- (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];
}

我认为现在的情况是,通过使用resetStandardUserDefaults,您已经强制从内存中刷新,包括序列化myObject

我敢打赌,如果您没有从内存中刷新它,standardUserDefaults的内存副本将尝试返回您为密钥“myServiceList”提供的原始myObject

如果您跟踪这些内容,我怀疑原始myObject已被某种方式损坏或删除

通过强制它给您一个新的myObject,从磁盘反序列化回来,您就没事了


您可以在调用resetStandardUserDefaults时挂起myObject的另一个副本来检查这一点,然后将其与稍后为键“myServiceList”返回的值进行比较。

您没有显示“myObject”-它是NSArray还是NSMutableArray?另外,您是否正在使用ARC?对不起,我刚才使用了“myObject”来简化事情,但是这个“myObject”应该等同于上面提到的“defaultArray”。是的,我使用的是ARC。它是NSMutableArray。通常,当您保存默认值时,您需要一个不可变的对象-所以请尝试使用“setObject:[NSArray arrayWithArray:defaultArray]“-我非常确定标准默认值不会复制对象,而且您也不想在背后对某些对象进行变异。除非我取消注释“/[NSUserDefaults resetStandardUserDefaults];”,否则仍然无法工作。”。注:对不起,我重新阅读了我的问题,崩溃发生在“[myDict setObject:[myService objectForKey:@“status”]forKey:@“status”;”,而不是“[defaults setObject:defaultArray forKey:@“myServiceList”;”;不管它是否解决了这个问题,都不要给用户默认的可变容器——这是一个非常糟糕的主意,以后可能会给你带来麻烦。
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:myObject forKey:@"myServiceList"];
[defaults synchronize];
//I added the following
[NSUserDefaults resetStandardUserDefaults];
- (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];
}