例えば
@implementation Sample @property (nonatomic, retain) name; @property (nonatomic, retain) email; @endというクラスがあった場合こんな感じでインスタンスをファイルに保存できる。
Sample* obj = [[Sample alloc] init]; obj.name = @"hello"; obj.email = @"he@llo.com"; NSDictionary* dict = [obj dictionaryRepresentation]; [dict writeToFile:@"sample.plist" atomically:YES];簡単。復元はこの逆。これも簡単。
NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile:@"sample.plist"]; Sample* obj = [Sample objectWithDictionaryRepresentation:dict];保存対象のプロパティを指定することができる。その場合は AMCKeysForDictionaryRepresentation をオーバーライドする。
対応しているプロパティの型は次の通り。構造体にも一部対応している。
Supported properties types AMC Enabled Objects. Common Collections (NSArray, NSMutableArray, NSDictionary, NSMutableDictionary) Custom Collections (Mutable/Not-Mutable, that can be used as keyValue(Dictionary) or Ordered(Array) collections ) Common Structures (NSRect/CGRect, NSSize/CGSize, NSPoint/CGPoint). Custom Structures (You will need to write additional code to encode/decode them to/from NSString).
仕組みは Objective-C のランタイムAPI を使い、プロパティを列挙してその名前をキーにして値を NSDictionary へ入れている。NSCoder/NSKeyedArchiver等は使っていない。ソースコードは Objective-CランタイムAPIの特にリフレクション系関数の使い方のお手本にもなる。
0 件のコメント:
コメントを投稿