2014-02-13 6 views
1

분할보기 (두 가지 UITableViews) 할 일 목록 유형 응용 프로그램에 사용할 사용자 정의 객체의 중첩 배열이 주로있는 모델을 만들었습니다. 왼쪽 (마스터)은 목록이고 오른쪽 (세부 사항)은 목록입니다. :) 다른 일부 변수는 isSelected, isExpanded와 같은 클래스 중 일부에 보관됩니다.nscopied 객체의 속성을 수정할 때 오류가 발생합니다.

이러한 모든 클래스는 NSCopying 프로토콜을 구현합니다. 마스터 목록 항목의 복사본을 만들고 작동하는 복사본의 이름을 변경할 때 해당 마스터 목록 항목에 속한 세부 목록 항목의 내용을 변경하면 복사본과 원본이 모두 변경됩니다. 그래서 내 질문에 마스터 목록 항목의 전체 사본을 어떻게 만듭니 까? 모든 사람들이 NSCopying 프로토콜을 구현하여 자동으로이 작업을 수행 할 것으로 생각했습니다. 나는 정말로 당신이 물어볼 필요가있는 무엇을 가지고 코드를 넣어야할지 모른다.

+0

당신은 구현해야 "깊은 사본". 재귀가 대부분을 처리 할 것이기 때문에 매우 간단합니다. 단지'deepCopy' 메쏘드를 구현하여 복사중인 객체로부터 직접적으로 주소가 지정된 모든 객체들을 처리하고 각각에'deepCopy'를 실행하여 그 결과를 복사본에 배치합니다 당신이 만들고 있어요. –

답변

1

NSKeyedArchiver에서 살펴보십시오. 배열 어레이를 아카이브하고 아카이브를 해제하면 복제본 전체가 복제됩니다.

(물론 이것은 단지 작품의 모든 객체는 보관을 지원하는 경우.)

0

는 어떻게 자신의 코드에 깊은 복사 로직을 구현함으로써 마스터 목록 항목

의 깊은 복사본을 생성 않습니다. 전체 복사본은 일반적으로 컬렉션의 모든 개체와 컬렉션에 연결된 모든 개체의 복사본을 만드는 것보다 - 경우가 있지만 일반적으로는 아닙니다. 어쨌든 깊은 사본을 지원하지만 매우 단순하고 비주기적인 객체 그래프로 제한되는 속성 목록 외부.

그래서 컬렉션을 반복하고 필요에 따라 컬렉션의 각 항목을 복사합니다. copyWithZone:을 구현하는 것이 타당한 것처럼 보일 수 있지만, 필요한 경우 원본 인스턴스를 기반으로 다양한 인스턴스를 수동으로 인스턴스화하고 필요에 따라 원본을 기반으로 다양한 속성을 설정하여 전체 복사본을 작성하는 경우가 많습니다.

0
-(MyClass)deepCopy { 
    MyClass* theCopy = [self mutableCopy]; 
    for (MyElementType* element in self.dataContainer) { 
     MyElementType* theCopiedElement = [element deepCopy]; 
     [theCopy somehowInsertThisElementInTheRightPlace:theCopiedElement]l 
    } 
    return theCopy; 
} 

물론, 그 5 번째 라인에 관여하는 마법의 비트가있다 - 당신이 그것을 어떻게 자회사 데이터에 의존 할 방법을 정확하게 항목이 개체에 첨부됩니다. 그러나 실제로는 3-4 가지 기본 시나리오 만 있습니다. 재귀는 자연스럽게 모든 것을 처리합니다.

(당신은 불변의 객체를 복사 "스마트"가 될 수없고 그리고 노트 등)

(또한 당신이있는 NSMutableArray와 NSMutableDictionary은 "범주"를 만들 수 있습니다.)