2013-04-23 33 views
2

我是新来的ObjectiveC和Xcode并出错。这一小段代码从getAllRecords获取一个字典(myDataPlist)。然后我在(myDataPlist)内创建一个可变的字典副本(1条记录),并用它解密1个字段。这工作完美。我只返回该记录(mutCopy)。这也适用。我的问题是原始字典(myDataPlist)的变化。它解密的记录也在(myDataPlist)中解密。 2 NSLog(@“%@”,myDataPlist)返回不同的结果。我肯定错过了什么。为什么(myDataPlist)更改?副本更改时NSDictionary更改

感谢您的帮助。

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

回答

2

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

使用

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

,而不是mutableCopy尝试。

从苹果文档:

otherDictionary

含有键和值来初始化新的字典与 字典。

标志

如果是,则在 otherDictionary每个对象接收copyWithZone:消息创建的 副本对象的对象必须符合NSCopying协议。在受管理的内存环境中,这不是 对象可能会收到的保留消息。然后将对象副本添加到 返回的字典中。如果否,则在托管内存环境中,其他Dictionary中的每个 对象仅在将 添加到返回的字典时才收到保留消息。

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

+0

我试过这个,它会在行myArray [1] = tString上导致异常。终止应用程序,由于未捕获的异常'NSInternalInconsistencyException',原因:' - [__ NSCFArray replaceObjectAtIndex:withObject:]:发送到不可变对象的变异方法 – 2013-04-23 02:51:43

+0

我一定看到过! :)这是因为数组不再可变。替换NSMutableArray * myArray = [mutCopy objectForKey:keys [x]];与NSMutableArray * myArray = [NSMutableArray arrayWithArray:[mutCopy objectForKey:keys [x]]] ;.这应该让你去。 – Suhas 2013-04-23 03:16:35

+0

你也可以尝试这个问题提供的解决方案http://stackoverflow.com/questions/5453481/how-to-do-true-deep-copy-for-nsarray-and-nsdictionary-with-have-nested-arrays -di – Suhas 2013-04-23 03:27:31