は、私は次の操作を行います。NSUndoManagerはオブジェクトを保持していますか?
[undoManager removeAllActions];
問題がremoveAllActionsアプリをクラッシュしていることである:
Path2D *pathToRemove = [path copy];
[[[self undoManager] prepareWithInvocationTarget:self] removePath:pathToRemove atIndex:index];
[pathToRemove autorelease];
は私もないクリアボタンがあります。私は[pathToRemove autorelease]を削除したときに動作しました(または少なくともクラッシュしませんでしたが、メモリリークの可能性があります)。私は、 'prepareWithInvocationTarget'コールで渡されたときにundoManagerが 'pathToRemove'を保持していると仮定していたと思います。
そうではありませんか?そうでない場合、 'removeAllActions'の呼び出しが 'PathToRemove'オブジェクトを解放しているため、クラッシュが発生する可能性があります。しかし、それはNSUndoManagerのバグである可能性は非常に低いです。
私のcopyWithZone実装は、 '[pathToRemove description]'と '[path description]'のNSLog出力が異なるアドレスを期待どおりに表示していると考えられます。
ご協力いただければ幸いです。ありがとう。
OK、私はそれを考え出しました。 'prepareWithInvokationTarget'は引数を保持します。私の問題は、私のcopyWithZoneメソッドが本当に間違っていたということでした。私はコピーされておらず、保持されていただけのオブジェクトを持っていました。したがって、 'RemoveAllActions'がオブジェクトを解放し、それぞれのDeallocメソッドに入ったとき、このメンバー変数の「コピー」されなかったリリースは、二重リリースシナリオを作成し、クラッシュを引き起こしました。再度、感謝します! – user482393