После того, как я разархивировал объект с помощью NSKeyedUnarchiver, я могу использовать его, как обычно, но не могу повторно архивировать его. При попытке вылетает.
[NSKeyedArchiver archiveRootObject:unarchivedObject toFile:fileName];
Я пытался заглянуть в ресурсы разработчика в Apple, но я не видел подробного объяснения правильного использования 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
Насколько я могу судить, это может быть мой класс Sounds. Я проверю это, пока вы проверяете это.
Хотя, после исследования я нашел это:
replacementObjectForKeyedArchiver:
Переопределяется подклассами для замены другого объекта для себя во время архивации с ключом.
- (id) replaceObjectForKeyedArchiver: (NSKeyedArchiver *) архиватор
Параметры
архиватор
Архивный архиватор, создающий архив.
Возвращаемое значение
Объект кодируется вместо получателя (если отличается).
обсуждение
Этот метод вызывается только в том случае, если в кодировщике не было установлено сопоставление замены для объекта (например, из-за предыдущего вызова replaceObjectForKeyedArchiver: этому объекту).