hachinoBlog

hachinobuのエンジニアライフ

自作クラスのインスタンスをplistに保存する方法

plistはNSString、NSNumber、実数型、数値型、ブール型、NSData、NSDate、NSArray、NSDictionaryのデータしか格納できないため、自作のクラスを配列に格納してplistに書き込もうとしてもエラーになる。
なので自作クラスのインスタンスをData型に変更してやる必要がある。
(要は自作クラスをアーカイブ化、アンアーカイブ化できるように作成すれば良い。)
アーカイブ化、アンアーカイブ化を可能にするにはNSCodingプロトコルの実装が必要。

//自作クラス
@interface Person : NSObject <NSCoding>

@property (nonatomic, copy) NSString *name;

@end

@implementation Person

//アーカイブされたファイルからオブジェクトの状態を復元するときに呼ばれるメソッド
- (id)initWithCoder:(NSCoder *)decoder
{
  self = [super init];
  if (self) {
    self.name = [decoder decodeObjectForKey:@"name"];
  }
  return self;
}

//オブジェクトをアーカイブするときに呼ばれるメソッド
- (void)encodeWithCoder:(NSCoder *)encoder
{
  [encoder encodeObject:name forKey:@"name"];
  [encoder encodeObject:address forKey:@"address"];
}

- (void)dealloc
{
    [_name release];
}
@end

//実装側
Person *person1 = [[Person alloc] init];
person1.name = @"hachi";

Person *person2 = [[Person alloc] init];
person2.name = @"nobu";

//アーカイブ化
NSData data1 = [NSKeyedArchiver archivedDataWithRootObject:person1];
NSData data2 = [NSKeyedArchiver archivedDataWithRootObject:person2];

NSArray *array = @[data1, data2];

//データ型を格納した配列をfilepath(plistファイル)に格納
BOOL result = [array writeToFile:filePath atomically:YES];

これでOK

参考URL
http://d.hatena.ne.jp/glass-_-onion/20110910/1315609950
http://d.hatena.ne.jp/glass-_-onion/20110904/1315145330