2011-12-28 2 views

답변

7

큰 개체 그래프에 필요한 시간이 걸릴 염려가없고 실제로 개체의 전체 복사본을 개로 만들려면 개체 그래프를 serialize 한 다음이를 deserialize 할 수 있습니다. 이 작업을 수행하는 가장 쉬운 방법은 모든 개체가 Foundation Collection 개체라는 가정하에 NSPropertyListSerialization 클래스를 사용하는 것입니다. 루트 개체를 데이터에 직렬화 한 다음 NSPropertyListMutableContainersAndLeaves 옵션을 사용하여 변경 가능한 루트 수준 배열에 deserialize하십시오. 생성 된 루트 레벨 변경 가능 배열은 전체 복사본이 될 것이고 모든 컨테이너는 변경 가능할 것입니다. 이 기능은 실제 사본이 될 것임을 기억하는 것이 중요합니다. 따라서 다른 컨테이너에서 무언가를 변경하면 해당 변경 사항이 원본 개체에 반영되지 않습니다. 난 당신이 블록 반복자를 사용하는 경우는 인덱스를 전달 될 것 때문에 더 효율적이 될 것입니다 모든 개체에 대해 그것을 볼 필요가 없습니다 것이라고 생각

// Assumes the root-level object is an array, adjust as necessary 
- (NSMutableArray*)deepMutableCopyOfArray:(NSArray*)array error:(NSError**)outError 
{ 
    NSError* error = nil; 
    NSData* serializedData = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error]; 
    if(!serializedData) { 
    if(outError) *outError = error; 
    return nil; 
    } 

    NSMutableArray* mutableCopy = [[NSPropertyListSerialization propertyListWithData:serializedData options:NSPropertyListMutableContainersAndLeaves format:NULL error:&error] retain]; 
    if(!mutableCopy) { 
    if(outError) *outError = error; 
    return nil; 
    } 

    return mutableCopy; 
} 
+0

아쉽게도 입력 배열에 NSNull이 포함되어 있으면이 작업이 수행되지 않습니다. – Vytis

2

코코아의 복사본은 일반적으로 얕습니다. 이것은 최상위 오브젝트 (이 경우에는 배열)에만 영향을 미친다는 것을 의미합니다. 불변의 사전을 변경할 수있는 배열로 끝날 것입니다. 당신이 묻는 것처럼 전체를 변경할 수있는 라이너가 없습니다.

1

이 작업을 수행하는 유일한 방법은 원본 배열을 반복하고 각 개체의 변경 가능한 복사본을 만들고 변경 가능한 배열의 변경 불가능한 개체를 해당 변경 가능한 형제로 바꾸는 것입니다. 휴, 변하기 쉬운 단어는 모든 의미를 잃어 버렸습니다.

NSArray *mutableArray = [originalArray mutableCopy]; 

for (NSDictionary *dictionary in originalArray) 
{ 
    NSInteger index = [originalArray indexOfObject:dictionary]; 
    NSMutableDictionary *mutableDictionary = [dictionary mutableCopy]; 
    [mutableArray replaceObjectAtIndex:index withObject:mutableDictionary]; 
} 

중첩 된 for 루프가있는 그래프를 자세히 살펴볼 수 있어야합니다. 배열의 크기에 따라 메모리를 확인하기 위해 자동 복구 풀이 필요할 수 있습니다.

+2

: 여기

빠른 코드 예제입니다 . –

+0

아! 블록 기반 열거 형입니다. 지금 iOS 4 이상의 기기에서 사용 가능합니다. –

관련 문제