2012-08-10 33 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; 
} 

有點怪異作爲蘋果的文檔說明您應該返回零,如果你不想更換對象...