Что происходит с незаархивированными объектами?

После того, как я разархивировал объект с помощью 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

Насколько я могу судить, это может быть мой класс «Звуки». Я проверю это, пока вы проверите это.

Хотя, после исследования я нашел это:

replacementObjectForKeyedArchiver:

Переопределяется подклассами для замены себя другим объектом во время архивации с ключом.

  • (id) replaceObjectForKeyedArchiver: (NSKeyedArchiver *) архиватор

Параметры архиватора Архиватор с ключом, создающий архив. Возвращаемое значение Объект кодирует вместо получателя (если отличается).

Обсуждение Этот метод вызывается только в том случае, если в кодировщике не было настроено сопоставление замены для объекта (например, из-за предыдущего вызова replaceObjectForKeyedArchiver: для этого объекта).


person Dane Man    schedule 17.06.2010    source источник
comment
Вам необходимо опубликовать содержимое файла -[Sounds encodeWithCoder:]. Пожалуйста, постарайтесь подумать, когда публикуете, что другим парням/дамам здесь понадобится, чтобы понять ошибку. Будьте изобретательны!   -  person Yuji    schedule 18.06.2010
comment
соответствует ли каждый объект протоколу NSCoding, который вы хотите заархивировать?   -  person holex    schedule 02.12.2014


Ответы (1)


Тема на форумах разработчиков Apple, похоже, указывает, что replacementObjectForKeyedArchiver: вызывается для объектов, которые вы пытаетесь закодировать. Похоже, что один из объектов, которые вы пытаетесь закодировать внутри -[Sounds encodeWithCoder:], был освобожден из памяти, и replacementObjectForKeyedArchiver: вызывается из-за ошибки seg.

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

person Reid Main    schedule 02.12.2014