출처 명시 : http://alnova2.tistory.com/archive/20090621
Property list object는 (plist라고 약칭) 객체가 자신을 파일로 저장하고 이를 다시 복구할수 있는 메소드를 구현한 객체들을 말한다. 이런 클래스 종류로는 NSArray, NSDictionary, NSString, NSNumber, NSDate, NSData 와 이들의 mutable counterparts 가 있다면 mutable counterparts object들도 포함된다.
다음의 예는 NSArray를 Disk로 저장하고 다시 Restore 하는 예제이다.
코드에서 보면 writeToFile 과 이를 retoure하기 위한 arrayWithContentsOfFile 메소드가 보인다. /tmp/test.txt에는 다음과 같이 저장되어 있다.
writeToFile에서 atomically는 temporary file에 먼져 저장하고 write가 성공하면 원래 파일로 swap 하도록 지시한다. (safety mechanism)
test.txt는 xml 파일 형태로 저장되어 있다. 이를 compressed binary format으로 변경이 가능한데 이때 사용하는 utility가 plutil 이다.
2. Object Encoding(Serialization)/Decoding(Deserialization)
Cocoa는 객체를 disk에 저장하고 restore 할수 있는 기제를 가지고 있다. 이를 encoding (serialization) / decoding (deserialization) 이라고 한다. 예를 들어 Interface Builder에서는 NSWindow와 NSTextFields 등의 Object를 serialize 하여 nib 파일에 저장한다. Serialization/Deserialization은 NSCoding protocol 을 adopting 하게 되면 가능하다.
@protocol NSCoding
- (void) encodeWithCoder: (NSCoder *) aCoder;
- (id) initWithCoder: (NSCoder *) aDecoder;
@end
NSCoder는 object를 NSData로 변경하거나 되돌리기 위한 유용한 함수들을 정의하고 있는 추상 클래스이다. Encode/Decode를 하기 위해서는 NSKeyedArchiver와 NSKeyedUnarchiver 를 사용한다.
다음의 예는 Object에 대해서 Serialization/Deserialization 한 예이다.
NSCoding을 Protocol을 Adopting 함을 선언한다.
NSKeyedArchiver는 Key/Value쌍을 이용하여 encoding/decoding을 수행한다. NSCoder에는 이를 위한 encode(decode)ObjectForKey, encode(decode)IntForKey 등의 메소드를 제공한다. NSKeyedArchiver 에서 archivedDataWithRootObject 메소드를 호출하게 되면 지정된 객체의 encodeWithCode를 호출하고 여기에 맞는 coder 객체를 넘겨준다. NSKeyedUnarchiver 의 unarchiveObjectWithData를 호출하게 되면 지정된 객체의 initWithCode를 호출하고 여기에 맞는 coder 객체를 넘겨준다.
상기 예에서 보여지는 것처럼 NSMutableArray가 지정되어 있으면 이 Array에 등록된 객체의 encode/decode 함수를 같이 호출해주어서 NSMutableArray에 등록된 객체들도 저장/복구가 된다는 것을 확인 가능하다. 상기 예는 Object -> NSData -> Object 로 encode/decode 하였다. NSData의 writeToFile, dataWithContentsOfFile 등의 메소드를 이용하여 Object -> NSData -> File -> NSData -> Object 로 저장/복구 가 가능한다.
댓글 없음:
댓글 쓰기