2

在我用 NSKeyedUnarchiver 取消归档一个对象后,我可以像往常一样使用它,但我无法重新归档它。当我尝试时,它崩溃了。

[NSKeyedArchiver archiveRootObject:unarchivedObject toFile:fileName];

我尝试在苹果中查看开发人员资源,但我还没有看到正确使用 NSKeyedArchiver 的完整说明。请帮忙。

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000023
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Application Specific Information:
objc_msgSend() selector name: replacementObjectForKeyedArchiver:
iPhone Simulator 3.2 (193.8), iPhone OS 3.2 (iPad/7B367)

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x958a0ed7 objc_msgSend + 23
1   OGLGame                         0x0000c7e2 -[Sounds encodeWithCoder:] + 59 (Sounds.m:86)
2   Foundation                      0x0280d25b _encodeObject + 827
3   Foundation                      0x028243cc -[NSKeyedArchiver _encodeArrayOfObjects:forKey:] + 284
4   Foundation                      0x0281a367 -[NSArray(NSArray) encodeWithCoder:] + 615
5   Foundation                      0x0280d25b _encodeObject + 827
6   OGLGame                         0x0000ebc2 -[Row encodeWithCoder:] + 244 (Row.m:153)
7   Foundation                      0x0280d25b _encodeObject + 827
8   Foundation                      0x028243cc -[NSKeyedArchiver _encodeArrayOfObjects:forKey:] + 284
9   Foundation                      0x0281a367 -[NSArray(NSArray) encodeWithCoder:] + 615
10  Foundation                      0x0280d25b _encodeObject + 827
11  Foundation                      0x0285de10 +[NSKeyedArchiver archiveRootObject:toFile:] + 176

据我所知,这可能是我的声音课。当你检查这个时,我会检查它。

虽然,经过研究,我发现了这一点:

replacementObjectForKeyedArchiver:

被子类覆盖以在键控归档期间用另一个对象替换它自己。

  • (id)replacementObjectForKeyedArchiver:(NSKeyedArchiver *)archiver

参数 archiver 创建档案的键控存档器。返回值 对象编码而不是接收者(如果不同)。

讨论 只有在编码器中没有为对象设置替换映射时才调用此方法(例如,由于先前调用了 replacementObjectForKeyedArchiver: 到该对象)。

4

1 回答 1

1

Apple 开发论坛上的一个主题似乎表明replacementObjectForKeyedArchiver:在您尝试编码的对象上调用了它。听起来您尝试在其中编码的对象之一-[Sounds encodeWithCoder:]已从内存中释放出来,并replacementObjectForKeyedArchiver:在导致段错误时被调用。

https://devforums.apple.com/message/1079616

于 2014-12-02T17:09:39.233 回答