Я пытался сериализовать объект SearchEntity
(пользовательский объект), содержащий NSMutableDictionary
, содержащий набор типа CategoryEntity
(пользовательский объект).
1 SearchEntity<NSCoding>
, содержащий: 1 NSMutableDictionary
(параметры) параметры, содержащие X CategoryEntities<NSCoding>
, содержащий только строки и числа.
В этой строке [encoder encodeObject:parameters forKey:kPreviousSearchEntityKey];
в SearchEntity encodeWithCoder "Я получаю GDB: прерывается каждый раз, нет сообщения об ошибке, исключения и т.д. только GDB: Прервано.
Это реализация в 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, он начнет сериализовать объект mutableDictionary с параметрами, NSCoder вызовет "encode" в CategoryEntities, содержащемся в словаре, и все они ответят своими правильными закодированными объектами.
Однако я просто получаю GDB: прервано в нижней части консоли.
Как я могу отладить это?
И мой подход неправильный, я должен обернуть все уровни кодирования в NSData?
Ps. Я делаю то же самое с ResultEntity
, содержащим NSArrays CategoryEntities
, он кодирует без проблем, поэтому я думаю, что NSMutableDictionary - это единственное, что торчит.