2

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: の以前の呼び出しが原因で)。

4

1 に答える 1

1

Apple dev フォーラムのスレッドは、replacementObjectForKeyedArchiver:エンコードしようとしているオブジェクトで が呼び出されていることを示しているようです。内部でエンコードしようとしているオブジェクトの 1 つが-[Sounds encodeWithCoder:]メモリから解放されreplacementObjectForKeyedArchiver:、セグ フォールトの原因で呼び出されているようです。

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

于 2014-12-02T17:09:39.233 に答える