프로퍼티 리스트 타입

프로퍼티 리스트는 코코아의 표준 데이터 타입 클래스들을 직렬화/역직렬화하는데 사용되는 구조화된 데이터 포맷이다. 프로퍼티 리스트는 .plist 라는 확장자의 파일로 기록되어 코코아 앱에서 광범위하게 쓰인다. 특히 모든 코코아/코코아터치 앱의 번들에는 기본적으로 Info.plist라는 파일이 있고, 이 파일은 앱의 기본적인 론칭에 필요한 필수적인 정보들(메인 nib파일 및 스토리보드 경로등)이 지정되어 있다.

프로퍼티 리스트는 구조화된 트리이며, 파일로 저장될 때에는 XML의 형식이나 바이너리 파일로 저장될 수 있다. 인터페이스 빌더에서 작성한 UI 구성 정보는 모두 프로퍼티 리스트로 만들어진다. 이 정보는 XML 형식을 써서 .xib 포맷으로 기록되었다가, 프로젝트를 빌드하는 시점에 컴파일되어 .nib파일로 변환된다.

프로퍼티 리스트 타입이란, 프로퍼티 리스트에 “들어갈 수 있는” 데이터 타입을 말한다. 보통 클립보드에 복사하기 위한 pasteboardPropertyList(ofType:)의 리턴값들은 프로퍼티 리스트에 들어갈 수 있는 다음의 타입중 하나여야 한다.

추상타입 XML 요소 코코아 클래스
array <array> NSArray
dictionary <dictionary> NSDictionary
string <string> NSString
data <data> NSData
date <date> NSDate
integer <integer> NSNumber
floating <real> NSNumber
Boolean <true/> , <false/> NSNumber

프로퍼티 리스트 타입에 속하는 클래스들은 보통 프로퍼티 리스트로부터 바로 객체화될 수 있고, 프로퍼티 리스트로는 별다른 변환없이 그대로 넘겨져서 시스템에 의해 자동으로 직렬화된다. 예를 들어서 NSArray<NSString *> * 타입의 배열이 있다면 이 배열의 전체 그래프는 하나의 프로퍼티 리스트 객체인 셈이다. 이 데이터를 만약 어딘가 저장하거나 할 때에는 여러 방법을 사용할 수 있다.

  1. 이들 클래스는 모두 NSCoding을 따르기 때문에 NSKeyedArchiver를 사용해서 이진 데이털 직렬화할 수 있고, 이 데이터를 그대로 기록할 수 있다.
  2. 프로퍼티 리스트 타입을 위한 NSPropertyListSerialization 클래스가 있다. +dataWithPropertyList:format:options:error:을 사용하여 직렬화할 수 있다.
  3. 위의 말은 곧 NSArray는 곧바로 파일에 기록될 수 있다는 것을 의미한다. 모든 프로퍼티 리스트 타입의 객체들은 -writeToURL:atomically:를 쓸 수 있다. (단, 이 메소드는 Xcode9 기준으로 deprecated되었다.)

3번을 생각한다면 프로퍼티 리스트 XML 요소를 사용해서 잘 포맷팅된 XML 파일이 있다면, 이로부터 NSArray, NSDictionary를 바로 읽어들이는 것도 가능하다는 이야기이다. (-initWithContentsOfURL:이 있다.)

다만 현재 Xcode 9 버전을 기준으로 NSArray, NSDictionary를 다른 클래스 도움 없이 파일에 쓰고, 읽는 메소드들은 deprecated된 상태이다. (물론 다른 대안들이 존재하긴 하지만) 이렇게 간편한 방법에 대한 새로운 API가 아직까지는 정식으로 공개되지는 않은 상태이다.