プロパティ リストのアーカイブを行っていますが、NSKeyedUnarchiver を使用してデータをアーカイブ解除すると、後でオブジェクトを解放するとアプリがクラッシュすることがわかりました。finishDecoding メッセージもオブジェクトを自動解放するかどうか疑問に思っていました。リリースするとクラッシュするのは奇妙に思えます。
2 に答える
何をリリースしますか?NSKeyedUnarchiver またはアーカイブされていないオブジェクト?
NSKeyedUnarchiver をリリースするかどうかは、作成方法によって異なります。通常のルールに従います。alloc
+を使用するinitForReadingWithData
場合はリリースする必要があり、unarchiveObjectWithData
orを使用する場合はリリースしunarchiveObjectWithFile
ないでください。
の結果に関してはdecodeObjectForKey
、メソッドが自動解放されたオブジェクトを返すという通常のルールにも従い、明示的に保持しない限り解放しないでください。
に関してfinishDecoding
: NSKeyedUnarchiver オブジェクトが解放される前に、明示的に呼び出す必要があります。その時点以降は unarchiver を使用しないでください。ただし、オブジェクトはまだ生きています。
アンアーカイバを初期化する場合
[[NSKeyedUnarchiver alloc] initForReadingWithData:data]
次に、アーカイブ解除が完了したら、それをリリースする責任があります。
リリース後にクラッシュする場合は、バグが別の場所にある可能性があります。おそらく、アンアーカイバーが提供するオブジェクトを保持せずに使用しているためです。アンアーカイバが割り当て解除されると、提供されたオブジェクトが解放されます。これらを保持しなかった場合、割り当てが解除され、これらのオブジェクトを参照するとクラッシュします。