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

은 사전의 사본 만 만들고 내용은 생성하지 않습니다. 따라서 [[myDataPlist valueForKey:key] mutableCopy]에서받은 사전은 본질적으로 동일한 개체에 대한 참조가있는 새로운 사전입니다 (전체 복사본이 아닙니다).

시도 대신 mutableCopy

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

를 사용하여. 애플의 문서에서

:

otherDictionary

새로운 사전을 초기화하는 로 키와 값을 포함하는 사전.

플래그

은 YES, otherDictionary 각 객체는 copyWithZone 받으면 : 메시지 물체 오브젝트가 NSCopying 프로토콜을 준수해야 의 복사본을 생성. 관리되는 메모리 환경에서는 그렇지 않으면 개체가 수신하는 보유 메시지 대신 사용됩니다. 그런 다음 객체 복사본이 반환 된 사전에 추가됩니다. NO이면 관리되는 메모리 환경에서 otherDictionary의 객체는 반환 된 사전에 이 추가 될 때 단순히 보유 메시지를받습니다.

사전에 사용자 지정 개체가 포함되어 있으면 해당 개체가 NSCopying 프로토콜을 준수하는지 확인하십시오.

+0

나는이 시도하고 줄 myArray [1] = tString 예외가 발생합니다. 'NSCFArray replaceObjectAtIndex : withObject :] : 변경 가능한 메소드가 불변 객체로 전송되었습니다. –

+0

나는 그것을 보아 왔음에 틀림 없습니다! :) 이것은 배열이 더 이상 변경할 수 없기 때문에 발생합니다. NSMutableArray 바꾸기 * myArray = [mutCopy objectForKey : keys [x]]; NSMutableArray를 사용하여 * myArray = [NSMutableArray arrayWithArray : [mutCopy objectForKey : keys [x]]] ;. 그게 너를 가야 해. – Suhas

+0

이 질문에 제공된 솔루션을 사용해 볼 수도 있습니다. http://stackoverflow.com/questions/5453481/how-to-do-true-deep-copy-for-nsarray-and-nsdictionary-with-have-nested-arrays -di – Suhas

관련 문제