1

私はiosプログラミングが初めてで、先月この学習を始めたばかりです。

この 2 日間、立ち往生している問題が 1 つあります。この問題を自分で解決する方法がわかりません。

そこで、この問題を解決するために、あなたにお願いしたいと思います!

これは私が得ているエラーです。

[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

NSUserDefaults から取得したオブジェクトは常に不変であるため、このエラーが発生することを知りました。

そのため、新しいオブジェクトを追加する配列を mutableCopy します。

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

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

ただし、もちろん、上記の 3 行目では、同じエラーが発生します。

このエラーが発生する理由はわかっていますが、この問題を解決するためのコーディング方法がわかりません。解決策は非常に単純で基本的なものだと思いますが、その方法がわかりません。

誰かがこの問題を解決するのを手伝ってくれたら幸いです!!

事前にどうもありがとうございました!

- (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 =         (
    );
}
)
4

2 に答える 2

1

取得している配列usersは変更可能なコピーではありません:

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

同じ配列に対してtemporaryArraytemporaryおよびを使用していますか? testArray打ち間違え?あなたが望むのは次のとおりだと思います:

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];
于 2013-10-12T01:44:24.057 に答える
1

配列のオブジェクトの 1 つである不変ディクショナリを変更しようとしています。

次のことを試してください。

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

}
于 2013-10-12T02:07:53.237 に答える