【发布时间】:2010-12-03 09:23:25
【问题描述】:
我试图序列化一个包含NSMutableDictionary 的SearchEntity 对象(自定义对象),该NSMutableDictionary 包含一组CategoryEntity(自定义对象)类型。
1 SearchEntity<NSCoding> 包含:
1NSMutableDictionary(参数)
参数包含
X CategoryEntities<NSCoding> 只包含字符串和数字。
在 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 时,它会开始序列化“参数” mutableDictionary 对象,NSCoder 将对字典中包含的 CategoryEntities 调用“encode”,它们都会以正确的编码对象响应.
但是我只是在控制台底部得到 GDB:Interrupted。
如何调试?
我的方法错了吗,我应该在 NSData 中包装所有级别的编码吗?
附言。我对包含CategoryEntities 的NSArrays 的ResultEntity 做同样的事情,它编码没有问题,所以我猜NSMutableDictionary 是唯一突出的东西。
【问题讨论】:
-
你有更多关于崩溃的信息吗? NSKeyed(un)Archiver 支持可变对象。崩溃可能是由其他原因引起的。
-
尝试在控制台中输入 continue - 在显示崩溃/堆栈跟踪之前,您可能需要这样做几次。
-
您是否在寻找僵尸对象?我通常发现这种出现在看起来还不错的代码上的莫名其妙的错误是由于僵尸造成的。
-
你的钥匙是什么?请注意,它们必须是 NSStrings。
-
An answer to a similar question 列出了一些与您的问题相关的有趣警告:(a)字典的键必须是
NSString和(b)虽然您可以保留可变对象,但它们将被恢复为不可变的等价物.
标签: ios nsmutabledictionary nscoding