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)replacementObjectForKeyedArchiver:(NSKeyedArchiver *)アーカイバー
パラメータ archiver アーカイブを作成するキー付きアーカイバ。戻り値 レシーバーの代わりにエンコードされるオブジェクト (異なる場合)。
解説 このメソッドは、エンコーダーでオブジェクトの置換マッピングが設定されていない場合にのみ呼び出されます (たとえば、そのオブジェクトへの replacementObjectForKeyedArchive: の以前の呼び出しが原因で)。