NSArray をコア データに直接格納することはできないため、配列を NSData に変換して、NSManagedObject の配列を別の NSManagedObject に格納しています。その配列に格納されている NSManagedObject は NSCoding プロトコルに準拠しており、アーカイブするためにこれらのクラスに NSCoding プロトコルのメソッドを実装しています。
@implementation MyClass
- (void)encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject: [self canPay] forKey: @"canPay"];
[coder encodeObject: [self guestId] forKey: @"guestId"];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
if((self = [self init]))
if (self)
{
[self setCanPay: [aDecoder decodeObjectForKey: @"canPay"]];
[self setGuestId: [aDecoder decodeObjectForKey: @"guestId"]];
}
return self;
}
次のコード行を使用して MyClass の配列を NSData として保存する
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:arrayContainingMyClass];
[myEntity setMyClassData:myData];
問題は、myClassData のアーカイブを解除しているときに、例外が発生することです....
NSData *newdata = [NSData dataWithData:myEntity.myClassData];
NSMutableArray *arr = [NSMutableArray arrayWithArray: [NSKeyedUnarchiver unarchiveObjectWithData:newdata]];
2行目で例外が発生しています。
キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[MyClass setCanPay:]: 認識されないセレクターがインスタンス 0x743c950 に送信されました'