タイプのセットSearchEntity(カスタムオブジェクト)を含むオブジェクト(カスタムオブジェクト)をシリアル化しようとしました。NSMutableDictionaryCategoryEntity
1SearchEntity<NSCoding>を含む:1 NSMutableDictionary(パラメーター)CategoryEntities<NSCoding>文字列と数字のみを含むXを含むパラメーター。
SearchEntity encodeWithCoderのこの行[encoder encodeObject:parameters forKey:kPreviousSearchEntityKey];で、「毎回GDB:Interruptedが表示され、エラーメッセージや例外などは発生せず、GDB:Interruptedだけが表示されます。
これはの実装でSearchEntityあり、パラメータはNSMutableDictionary
#pragma mark -
#pragma mark NSCoding delegate methods
- (void) encodeWithCoder:(NSCoder*)encoder
{
//encode all the values so they can be persisted in NSUserdefaults
if (parameters)
[encoder encodeObject:parameters forKey:kPreviousSearchEntityKey]; //GDB:Interrupted!
}
- (id) initWithCoder:(NSCoder*)decoder
{
if (self = [super init])
{
//decode all values to return an object from NSUserdefaults in the same state as when saved
[self setParameters:[decoder decodeObjectForKey:kPreviousSearchEntityKey]];
}
return self;
}
またCategoryEntity、NSCodingプロトコルを実装し、次のようになります。
- (void) encodeWithCoder:(NSCoder*)encoder
{
//encode all the values so they can be persisted in NSUserdefaults
[encoder encodeObject:ID forKey:kIDKey];
[encoder encodeObject:text forKey:kTextKey];
[encoder encodeObject:category forKey:kCategoryKey];
[encoder encodeObject:categoryIdentifierKey forKey:kCategoryIdentifierKey];
}
- (id) initWithCoder:(NSCoder*)decoder
{
if (self = [super init]) {
//decode all values to return an object from NSUserdefaults in the same state as when saved
[self setID:[decoder decodeObjectForKey:kIDKey]];
[self setText:[decoder decodeObjectForKey:kTextKey]];
[self setCategory:[decoder decodeObjectForKey:kCategoryKey]];
[self setCategoryIdentifierKey:[decoder decodeObjectForKey:kCategoryIdentifierKey]];
}
return self;
}
次のように、NSUserDefaultsのラッパーからエンコードしようとします。
+ (void) setPreviousSearchParameters:(SearchParameterEntity*) entity
{
if (entity)
{
//first encode the entity (implements the NSCoding protocol) then save it
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:entity];
[[self defaults] setObject:encodedObject forKey:kPreviousSearchKey];
[[self defaults] synchronize];
}
}
+ (SearchParameterEntity*) getPreviousSearchParameters
{
//retrieve the encoded NSData object that was saved, decode and return it
SearchParameterEntity *entity = nil;
NSData *encodedObject = [[self defaults] objectForKey:kPreviousSearchKey];
if (encodedObject)
entity = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
return entity;
}
SearchEntityをシリアル化するように要求すると、'parameters' mutableDictionaryオブジェクトのシリアル化が開始され、NSCoderは辞書に含まれるCategoryEntitiesで "encode"を呼び出し、それらはすべて正しいエンコードされたオブジェクトで応答すると考えていました。
ただし、コンソールの下部にGDB:Interruptedが表示されます。
どうすればこれをデバッグできますか?
そして、私のアプローチは間違っています、NSDataですべてのレベルのエンコーディングをラップする必要がありますか?
追伸 ResultEntityを含むNSArrayを使用してまったく同じことを行いますCategoryEntities。問題なくエンコードされるため、NSMutableDictionaryだけが突出していると思います。