21077


配列の値の遷移を保存しておきたいと思い、下の例のようなプログラムを作成しました。

[code]

    NSMutableDictionary*  historyDic = [NSMutableDictionary dictionary];
    NSMutableArray* array = [NSMutableArray array];
    
    [array addObject:@"1"];
    [historyDic setObject:array forKey:@"First"];
    
    [array addObject:@"2"];
    [historyDic setObject:array forKey:@"Second"];
    
    [array addObject:@"3"];
    [historyDic setObject:array forKey:@"Third"];
    
    NSLog(@"First ->%@" , [historyDic objectForKey:@"First"]);
    NSLog(@"Second->%@" , [historyDic objectForKey:@"Second"]);
    NSLog(@"Third ->%@" , [historyDic objectForKey:@"Third"]);
    
[/code]

しかし、このように辞書に途中途中でオブジェクトを保存しても参照として保存されるのでどのキーのオブジェクトも読み出し時の状態になってしまっています。

実行結果：

[code]

    First -> (1,2,3)
    Second-> (1,2,3)
    Third -> (1,2,3)
    
[/code]

期待した結果：

[code]

    First -> (1)
    Second-> (1,2)
    Third -> (1,2,3)
    
[/code]

NSMutableDictionaryに参照ではなく、値としてオブジェクトを保存する方法はないのでしょうか？


CC BY-SA 3.0
2016-01-19T12:14:18.137
21076
2016-03-12T07:30:57.837
2016-01-19T12:28:04.280
3639
12490
question
objective-c
NSMutableDictionary にオブジェクトを値で保存したい


値を保存することはできませんが、`[NSMutableArray
arrayWithArray:array]`でNSMutableArrayのコピーの参照を保存することができます。

[code]

    NSMutableDictionary*  historyDic = [NSMutableDictionary dictionary];
    NSMutableArray* array = [NSMutableArray array];
    
    [array addObject:@"1"];
    [historyDic setObject:[NSMutableArray arrayWithArray:array] forKey:@"First"];
    
    [array addObject:@"2"];
    [historyDic setObject:[NSMutableArray arrayWithArray:array] forKey:@"Second"];
    
    [array addObject:@"3"];
    [historyDic setObject:[NSMutableArray arrayWithArray:array] forKey:@"Third"];
    
    NSLog(@"First ->%@" , [historyDic objectForKey:@"First"]);
    NSLog(@"Second->%@" , [historyDic objectForKey:@"Second"]);
    NSLog(@"Third ->%@" , [historyDic objectForKey:@"Third"]);
    
[/code]


CC BY-SA 3.0
2016-01-19T12:36:00.790
21077
2016-01-19T12:36:00.790
3639
21076
answer

[code]

    NSMutableArray *historyArray = [[NSMutableArray alloc] init];
    NSMutableArray *array = [NSMutableArray array];
    
    [array addObject:@"1"];
    [histroyArray addObject [NSArchiver archivedDataWithRootObject:array];
    
    [array addObject:@"2"];
    [histroyArray addObject [NSArchiver archivedDataWithRootObject:array];
    
    [array addObject:@"3"];
    [histroyArray addObject [NSArchiver archivedDataWithRootObject:array];
    
    NSUInteger history = 0;
    for (NSData *past in historyArray) {
        NSLog(@"%ld -> %@", ++history, [NSUnarchiver unarchiveObjectWithData:past]);
    
[/code]

とすると、どんなデータ型にも使えますね


CC BY-SA 3.0
2016-03-12T07:30:57.837
23050
2016-03-12T07:30:57.837
14745
21076
answer