2008-09-29 6 views
9

NSDictionary 또는 NSCoder/NSCoding을 사용할시기를 결정하는 방법을 알아 내려고하고 있습니까?NSCoder 대 NSDictionary, 언제 사용합니까?

일반 속성 목록과 NSDictionary를 사용하면 응용 프로그램 외부에서 쉽게 편집 할 수있는 XML 파일을 생성하는 것이 쉬운 것처럼 보입니다.

내부에 중첩 된 데이터 또는 다른 사용자 정의 클래스를 보유하고있는 사용자 정의 클래스를 다루는 경우, 포함 된 모든 오브젝트 클래스를 단계별 처리하고 아카이브 명령이 인코딩 될 때 NSCoder/NSCoding이 더 나은 경로 인 것처럼 보입니다. 사용.

NSDictionary는 NSCoder/NSCoding이 NSCoding 인터페이스를 구현하는 중첩 된 사용자 정의 클래스를 자동으로 인코딩 할 때 모든 속성 또는 데이터 특성을 단일 수준으로 가져 오는 데 더 많은 작업을 필요로하는 것처럼 보입니다.

외부에는 이진 데이터가 있고 응용 프로그램 외부에서 편집 할 수없는 것이 다른 하나를 사용하는 진짜 이유입니까? 그리고 그 선을 따라 두 가지 사이에 어떤 방향으로 기울여야하는지에 대한 지표가 있습니까? 나는 명백한 것을 놓치고 있는가?

답변

9

object graphs에 애플의 문서는이 대답했습니다

맥 OS X 직렬화 저장소 등의 사전, 배열, 문자열 및 이진 데이터 값을 개체의 간단한 계층 구조. 직렬화는 오브젝트의 값과 계층에서의 위치 만 보존합니다. 같은 값 객체에 대한 여러 참조는 직렬화 될 때 여러 객체를 생성 할 수 있습니다. 객체의 변경 가능성은 유지되지 않습니다.

...

Mac OS X 아카이브는 임의로 복잡한 개체 그래프를 저장합니다. 아카이브는 그래프의 모든 객체와 그래프의 다른 모든 객체와 모든 관계를 유지합니다. 아카이브되지 않은 경우 재 작성된 객체 그래프는 거의 예외없이 원래 객체 그래프의 사본이어야합니다.

나는이 해석 방법은은, 직렬화 (예를 들어,있는 NSDictionary를 사용하여이) 갈 수있는 좋은 방법입니다 당신이 값을 간단하게 저장하려면, 점이다. 유일성과 변경 가능성을 보존하면서 객체 그래프을 임의의 유형으로 저장하려면 아카이브 (예 : NSCoder)를 사용하는 것이 가장 좋습니다.

또한이 주제를 다루기 때문에 위의 객체 그래프 페이지가 일부인 Apple의 Archives and Serializations Programming Guide for Cocoa을 읽을 수도 있습니다.

1

당신이 조금 혼란 스럽다고 생각합니다. NSDictionary는 데이터 구조이며, NSCoding 프로토콜을 구현합니다. 따라서 본질적으로 모든 데이터를 NSDictionary에 저장하고 나중에 인코딩하거나 NSCoder 프로토콜을 구현하고 NSCoder API를 사용하여 개체 트리를 인코딩 할 수 있습니다. encodeWithCoder : 메서드에 전달 된 NSCoder 객체의 유형에 따라 인코딩 결과가 출력됩니다.

+1

저는 그/그녀가 속성 목록 직렬화와 NSCoder 직렬화를 언급하고 있다고 생각합니다. – schwa

5

나는 파일에 개체 그래프에는 직렬화하기 위해 (우리가 이름을 선택해야합니다!) NSCoding/NSCoder/NSArchiver를 사용 하지 큰 팬이다.

이렇게 생성 된 보관소는 매우 연약합니다. Foo 클래스의 객체를 저장 한 경우 golly를 사용하면 응용 프로그램에 Foo 클래스가 있음을 확인할 수 있습니다.

이렇게하면 NSCoder 기반 직렬화가 다른 응용 프로그램과 파일을 공유하는 관점에서 어렵게 만들거나 향후 응용 프로그램과의 호환성을 전달할 수 있습니다.

+2

이 동의했습니다. 나는 그 길로 내려 갔고, 나중에 그것을 후회했다. – greenisus

+0

난 그냥이 물건을 배우고있어,하지만 그것은 NSKeyedArchiver와 NSKeyedUnarchiver가 [스키마를 앞으로 옮기는 것]을 제공하는 것으로 보인다. (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual /Archiving/Articles/compatibility.html#//apple_ref/doc/uid/20001055-BCICFFGE) ... 그리고 golly를 사용하면 [-setClass : forClassName :] (http://developer.apple.com/library)를 사용할 수 있습니다. /mac/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/Reference/Reference.html#//apple_ref/occ/instm/NSKeyedUnarchiver/setClass%3aforClassName%3a) 데이터를 다시로드 할 때 클래스를 변경합니다. – AlexChaffee

2

내가 추천하는 것을 깜빡하고 있습니다.

NSCoding은 특정 상황에서 괜찮을 수 있습니다. 간단하고 빠른 작업을 수행하는 경우 (코드를 많이 작성해야하지만 직렬화 할 클래스 당 두 가지 방법). 다른 응용 프로그램과의 호환성에 대해 걱정하지 않는다면 괜찮을 수도 있습니다.

속성 목록 (아마도 NSPropertyListSerializaion 클래스 사용)을 통한 내보내기/가져 오기는 훌륭한 해결책입니다. XML 기반 plists는 쉽게 작성하고 편집 할 수 있습니다. plists의 주요 이점은 파일 형식을 응용 프로그램에만 묶는 것이 아니라는 것입니다.

또한 NSXMLDocument API 및 친구를 사용하여 고유 한 XML 기반 파일 형식을 만들고이 파일 형식을 읽고 쓸 수 있습니다. 이것은 실제로 속성 목록을 사용하는 것보다 많은 작업이 아닙니다.