2012-08-10 71 views
0

解码时我上decodeObjectForKey一个EXC_BAD_ACCESS:打电话。我将不胜感激,如果任何人都可以发现一个明显的错误在这里:EXC_BAD_ACCESS与NSKeyedUnarchiver

- (NSData *)serialize:(id <NSCoding>)object { 
    NSMutableData *data = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    [archiver setOutputFormat:NSPropertyListBinaryFormat_v1_0]; 
    [archiver encodeObject:object forKey:@"myobject"]; 
    [archiver finishEncoding]; 
    return data; 
} 

- (id)deserialize:(NSData *)data { 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
    unarchiver.delegate = self; 
    id object = [unarchiver decodeObjectForKey:@"myobject"]; 
    [unarchiver finishDecoding]; 
    return object; 
} 

NSCoding协议是这样实现的:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super init]; 
    if (self != nil) { 
    _fields = [aDecoder decodeObjectForKey:@"fields"]; 
    _entries = [aDecoder decodeObjectForKey:@"entries"]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:_fields forKey:@"fields"]; 
    [aCoder encodeObject:_entries forKey:@"entries"]; 
} 

我不能使用+ unarchiveObjectWithData:因为我需要设置一个代理更新反序列化对象:

- (id)unarchiver:(NSKeyedUnarchiver *)unarchiver didDecodeObject:(id)object { 
    if([[object class] isSubclassOfClass:[LCEntity class]]) { 
    [object setStore:_store]; 
    } 
    return nil; 
} 
我使用ARC

- 所以不用担心内存管理的问题。

+0

请发表您的NSCoding协议的执行情况。 – 2012-08-10 22:29:24

+0

你能张贴崩溃的堆栈跟踪?另外,你对'-isSubclassOfClass:'的调用不必要的冗长。你可以说'[object isKindOfClass:[LCEntity class]]'。 – 2012-08-11 00:11:47

回答

0

你能实际使用的归档/取档呀?通常,您有一个已编码的根对象,并对图的其余部分进行编码。尝试使用以下内容:

- (NSData *)serialize:(id <NSCoding>)object { 
    return [NSKeyedArchiver archivedDataWithRootObject:object]; 
} 

- (id)deserialize:(NSData *)data { 
    return [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 

当然,在这一点上,-serialize:和-deserialize:方法是非常多余的。他们的调用者应该直接调用NSKeyedArchiver/NSKeyedUnarchiver。


或者,您的编码对象或其子对象之一,但可能有一个坏的执行-initWithCoder:。这应该在堆栈跟踪中显而易见。

+0

我其实也在想,同样的,我正在看它应该与编码一起工作的文档。 – 2012-08-10 22:32:17

+0

我说为什么我不能使用的便利方法的详细信息。还检查了所有我的initWithCoder:方法 - 它似乎并不成为问题的根源。 – mirkokiefer 2012-08-11 00:17:26

0

我可以总是在我NSKeyedUnarchiverDelegate返回对象解决问题:

- (id)unarchiver:(NSKeyedUnarchiver *)unarchiver didDecodeObject:(id)object { 
    if([[object class] isSubclassOfClass:[LCEntity class]]) { 
    [object setStore:_store]; 
    } 
    return object; 
} 

有点怪异作为苹果的文档说明您应该返回零,如果你不想更换对象...