decodeObjectForKey: 呼び出しで EXC_BAD_ACCESS を取得します。誰かがここで明らかなバグを見つけてくれたらありがたいです:
- (NSData *)serialize:(id <NSCoding>)object {
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver setOutputFormat:NSPropertyListBinaryFormat_v1_0];
[archiver encodeObject:object forKey:@"myobject"];
[archiver finishEncoding];
return data;
}
- (id)deserialize:(NSData *)data {
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.delegate = self;
id object = [unarchiver decodeObjectForKey:@"myobject"];
[unarchiver finishDecoding];
return object;
}
NSCoding プロトコルは次のように実装されます。
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self != nil) {
_fields = [aDecoder decodeObjectForKey:@"fields"];
_entries = [aDecoder decodeObjectForKey:@"entries"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_fields forKey:@"fields"];
[aCoder encodeObject:_entries forKey:@"entries"];
}
+unarchiveObjectWithData: は使用できません。デシリアライズされたオブジェクトを更新するデリゲートを設定する必要があるためです。
- (id)unarchiver:(NSKeyedUnarchiver *)unarchiver didDecodeObject:(id)object {
if([[object class] isSubclassOfClass:[LCEntity class]]) {
[object setStore:_store];
}
return nil;
}
私は ARC を使用しているので、メモリ管理の問題について心配する必要はありません。