Iphone 处理从NSUserDefaults返回的对象时遇到问题

Iphone 处理从NSUserDefaults返回的对象时遇到问题,iphone,ios,objective-c,Iphone,Ios,Objective C,我是ios编程新手,上个月才开始学习 有一个问题我在过去的两天里一直困扰着。 我自己想不出怎么解决这个问题 所以,我想请你帮个忙,帮我解决这个问题 这就是我得到的错误 [__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 我了解到我得到这个错误是因为我从NSUserDefaults得到的对象总是不可变的 因此,我可以复制我想要添加新对象的数组 NSMutableArray *tem

我是ios编程新手,上个月才开始学习

有一个问题我在过去的两天里一直困扰着。 我自己想不出怎么解决这个问题

所以,我想请你帮个忙,帮我解决这个问题

这就是我得到的错误

[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'
我了解到我得到这个错误是因为我从NSUserDefaults得到的对象总是不可变的

因此,我可以复制我想要添加新对象的数组

    NSMutableArray *temporaryArray = [users[1][@"users"] mutableCopy];
    [temporaryArray addObject:myData];

    users[1][@"users"] = temporaryArray;
但是,当然,在上面的第三行,它会导致相同的错误

我知道它导致此错误的原因,但我不知道如何编写代码来解决此问题。我认为解决方案非常简单和基本,但我不知道如何解决

如果有人帮我解决这个问题,我将不胜感激

提前非常感谢

- (void)saveData
{

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSMutableArray *users = [userDefaults objectForKey:@"users"];

    NSDictionary *myData = @{@"name":@"test", @"birthdate":@"1981-01-01", @"sex":@"male"};

    NSMutableArray *temporaryArray = [users[1][@"users"] mutableCopy];
    [temporaryArray addObject:myData];

    users[1][@"users"] = temporaryArray;



    [userDefaults setObject:users forKey:@"users"];
    [userDefaults synchronize];

    [self.target performSelector:self.action withObject:@"test.png"];

    [self dismissViewControllerAnimated:YES completion:nil];

}
用户数组的结构。

(
    {
    label = "\U81ea\U5206";
    users =         (
                    {
            birthdate = "2013-10-12";
            name = Test;
            sex = "\U7537\U6027";
        }
    );
},
    {
    label = "Family(\U5bb6\U65cf)";
    users =         (
    );
},
    {
    label = "Friends(\U53cb\U9054)";
    users =         (
    );
}
)

您获得的数组
用户
不是可变副本:

NSMutableArray *users = [userDefaults objectForKey:@"users"];
您正在对同一数组使用
临时数组
临时数组
测试数组
?打字错误我想你想要的是:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *users = [[userDefaults objectForKey:@"users"] mutableCopy];

NSDictionary *myData = @{@"name":@"test", @"birthdate":@"1981-01-01", @"sex":@"male"};

NSMutableArray *usersNested = [users[1][@"users"] mutableCopy];
[usersNested addObject:myData];
[users replaceObjectAtIndex:1 withObject:usersNested];

[userDefaults setObject:users forKey:@"users"];
[userDefaults synchronize];

您正试图变异数组对象之一的不可变字典

请尝试以下操作:

- (void)saveData
{

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSMutableArray *users = [[userDefaults objectForKey:@"users"] mutableCopy];

    NSDictionary *myData = @{@"name":@"test", @"birthdate":@"1981-01-01", @"sex":@"male"};

    //Create a mutable copy of the dictionary object at index 1.
    NSMutableDictionary* mutableUsers = [users[1] mutableCopy]

    NSMutableArray *temporaryArray = [mutableUsers[@"users"] mutableCopy];
    [temporaryArray addObject:myData];
    mutableUsers[@"users"] = [temporaryArray copy];

    //Replace the dictionary with an immutable copy of the new dictionary.
    users[1] = [mutableUsers copy];

    [userDefaults setObject:users forKey:@"users"];
    [userDefaults synchronize];

    [self.target performSelector:self.action withObject:@"test.png"];

    [self dismissViewControllerAnimated:YES completion:nil];

}

谢谢你的帮助!是的,临时数组和测试数组应该是临时数组。我犯了一个错误。谢谢您指出。我想将“myData”添加到用户[1][@“users”],而不是“users”。所以,我正在努力解决这个问题。谢谢你的帮助!我刚试过你的密码。但是我得到了这个错误。“”-[\uu NSCFArray objectforkeydsubscript:]:无法识别的选择器发送到实例0x942d7d0'”我在帖子中添加了“user”数组的结构。这与此错误有关系吗?当您在数组而不是字典上调用
[@“users”]
时,会出现此错误。但是根据您的数据模型
用户[1]
应该是字典而不是数组。如果您需要帮助,请告诉我。我可能混合了一些对象类型。您尚未提供有关数据结构设置方式的任何信息。用户默认键“users”中保存了什么?请原谅,现在是早上5:53,但是users[1]是字典对象,是吗?如果是,我在文本编辑复制/粘贴中没有看到错误。=]您在其他解决方案中也遇到了此错误。我认为问题在于你保存的数据。您是如何打印数据结构的?什么时候?可能是您的用户默认值已损坏。在我的代码中,我添加了另一个用户。但是在代码中,我们没有告诉表刷新。在您的示例中,没有提到表视图。您需要使用表视图调用视图控制器,并告诉它数据已更改。