Ric*_*kiG 22 nscoding nsmutabledictionary ios
我试图序列化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;
}
Run Code Online (Sandbox Code Playgroud)
该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;
}
Run Code Online (Sandbox Code Playgroud)
我尝试从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;
}
Run Code Online (Sandbox Code Playgroud)
我在想,当我问到序列化SearchEntity,它将开始连载的"参数" mutableDictionary对象,NSCoder将调用包含在字典中的CategoryEntities"编码",他们都将与他们的正确编码的对象作出回应.
但是我只是得到了GDB:在控制台的底部中断了.
我该怎么调试呢?
而且是我的方法不对,我应该在包装NSData的编码的各个层面?
PS.我使用ResultEntity
包含NSArrays 的完全相同的东西CategoryEntities
,它编码没有问题,所以我想NSMutableDictionary是唯一突出的东西.
Mir*_*vac -1
使用 NSKeyedArchiver 归档对象的问题是无法对可变对象进行编码。仅NSArray、NSDictionary、NSString、NSDate、NSNumber和NSData(及其一些子类)的实例可以被序列化
因此,在您的 SearchEntity 方法中,encodeWithCoder:
您应该尝试从 NSMutableDictionary 创建 NSDictionary,然后对不可变的进行编码:
if (parameters) {
NSDictionary *dict = [NSDictionary dictionaryWithDictionary:parameters];
[encoder encodeObject:dict forKey:kPreviousSearchEntityKey];
}
Run Code Online (Sandbox Code Playgroud)
另外,在initWithCoder:
方法中尝试从编码的不可变字典创建 NSMutableDictionary:
NSDictionary *dict = [decoder decodeObjectForKey:kPreviousSearchEntityKey];
[self setParameters:[NSMutableDictionary dictionaryWithDictionary:dict]];
Run Code Online (Sandbox Code Playgroud)
还要检查parameters
字典中的所有对象是否符合 NSCoding 协议,并确保所有对象在其encodeWithCoder:
方法中仅编码不可变对象。
希望它能解决问题。