2010-06-17 3 views
1

После того, как я заблокировал объект с помощью NSKeyedUnarchiver, я могу использовать его, как обычно, но я не могу его повторно архивировать. Когда я пытаюсь, он падает.Что происходит с unarchived объектами?

[NSKeyedArchiver archiveRootObject:unarchivedObject toFile:fileName]; 

Я пытался смотреть в ресурсах для разработчиков в яблоке, но я не видел тщательный explination надлежащего использования 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: 

переопределены подклассами, чтобы заменить другой объект для себя во время шпоночным архивирования.

  • (идентификатор) replacementObjectForKeyedArchiver: (NSKeyedArchiver *) архиватор

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

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

+0

Вы должны опубликовать содержимое '- [Звуки encodeWithCoder:]'. Пожалуйста, попробуйте подумать, отправляя сообщения другим парням/женщинам здесь, чтобы понять ошибку. Будьте изобретательны! – Yuji

+0

каждый объект соответствует протоколу 'NSCoding', который вы хотите архивировать? – holex

ответ

0

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

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

Смежные вопросы