2013-04-23 39 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