2

我是 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 ;
}
4

1 回答 1

3

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

尝试使用

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

而不是mutableCopy.

来自 Apple 文档:

其他词典

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

旗帜

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

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

于 2013-04-23T02:10:37.993 回答