2

NSUndoManager メソッド prepareWithInvocationTargetは引数を保持しません。Apple docs にはこれへのリンクはありませんが、プロファイラーで確認しましたが、そうではないと確信しています。これは、オブジェクトを削除して元に戻す準備をする場合は、自分で保持する必要があることを意味します (ごみ箱配列に割り当てて元のリンクを削除するなど)。この種の偽の削除は、特に古い取り消しを削除する必要がある場合に、多くの不必要な騒ぎを引き起こします。

ただし、NSInvocationは、 retainArguments メソッドを呼び出すことで引数を保持できます。NSUndoManager は prepareWithInvocationTarget に NSInvocation を使用するため、retainArguments を NSUndoManager に渡す方法である可能性があります。

問題は - どうやってそれを行うのですか?

4

2 に答える 2

2

元に戻すアーキテクチャガイドに記載されています。

NSUndoManager オブジェクトは、元に戻す操作の対象を保持しません。クライアント (元に戻す操作を実行するオブジェクト) は通常、元に戻すマネージャーを所有するため、元に戻すマネージャーがターゲットを保持すると、保持サイクルが頻繁に発生します。

いいえ、そうではありません-ドキュメントに記載されている理由によります。

ライブ サイクルを自分で管理する必要があります。あなたのアプリモデルに完全に依存し、完全に固有のものです..一般的な質問は次のようになります。

NSUndoManager が元に戻すスタックからアクションを「ポップ」するタイミングをどのように知ることができますか (これにより、元に戻す操作のために保持しているコンテキスト データを安全に削除できます)。

残念ながら、NSUndoManager クラス リファレンスremoveAllActionsWithTarget:には (文書化された) 通知はありません。これは、アンドゥ マネージャ インスタンスで呼び出された場合などに送信されます。

その追加情報を永久に保持する (または手動で元に戻すのレベルを制限し、それに応じて元に戻すコンテキスト データのストレージを調整する) ための実際の代替手段はほとんどないようです。

于 2014-03-17T18:21:37.373 に答える