更改副本时NSDictionary会更改

时间:2013-04-23 01:37:54

标签: iphone objective-c

我是ObjectiveC和Xcode的新手并且犯了错误。这段代码从getAllRecords获取字典(myDataPlist)。然后我在(myDataPlist)中制作一个字典(1条记录)的可变副本,并用它解密1个字段。这非常有效。我只返回那条记录(mutCopy)。这也有效。我的问题是原始字典(myDataPlist)的变化。它解密的记录也在(myDataPlist)中解密。 2 NSLog(@“%@”,myDataPlist)返回不同的结果。我肯定错过了什么。为什么(myDataPlist)会改变?

感谢您的帮助。

-(NSDictionary *)getRecordForKey:(NSString *)key{

    NSDictionary *myDataPlist = [self getAllRecords];
    NSMutableDictionary *mutCopy = [[myDataPlist valueForKey:key] mutableCopy];
    NSArray *keys = [mutCopy allKeys];
    NSData *tData = [[NSData alloc]init];
    NSLog(@"%@",myDataPlist);
    for (int x = 0; x <= [keys count] - 1; x++) {
        if (![keys[x] isEqualToString:@"Template"] && ![keys[x] isEqualToString:@"RecNum"]) {

        NSMutableArray *myArray = [mutCopy objectForKey:keys[x]];
        tData = myArray[1];
        NSString *tString = [tData decryptData:tData withKey:self.settingsManager.masterPad];
        myArray[1] = tString;
        [mutCopy setObject:myArray forKey:keys[x]];

        }
    }
    NSLog(@"%@",myDataPlist);
    return mutCopy ;
}

1 个答案:

答案 0 :(得分:2)

mutableCopy仅创建字典的副本,而不是其内容。因此,您从[[myDataPlist valueForKey:key] mutableCopy]收到的字典本质上是一个新的字典,引用了相同的对象(它不是深层副本)。

尝试使用

NSMutableDictionary *mutCopy = 
    [[NSMutableDictionary alloc] initWithDictionary:[myDataPlist valueForKey:key] 
                                          copyItems:YES];

而不是mutableCopy

来自Apple文档:

  

otherDictionary

     

包含键和值的字典   初始化新词典。

     

标志

     

如果是,则每个对象都在   otherDictionary接收copyWithZone:消息来创建副本   对象对象必须符合NSCopying协议。在一个   托管内存环境,这是保留消息而不是   否则会收到对象。然后将对象副本添加到   返回字典。如果为NO,则在每个托管内存环境中   otherDictionary中的对象只是接收到保留消息   添加到返回的字典中。

如果您的字典包含自定义对象,请确保它们符合NSCopying协议。