アンドゥ処理の上限設定


今作っているアプリで、指でタッチして絵を描く処理があって、そこでアンドゥ処理ができるようにNSUndoManagerを導入しています。

やり方は割と簡単で、まずNSUndoManagerインスタンスを作って、

undoManager = [[NSUndoManager alloc] init];

アンドゥマネージャーにアウンドゥしたい処理を登録していくだけです。

例えば、このように登録しておくとスタックに貯めておいてくれて

[[undoManager prepareWithInvocationTarget:self] setColorAt:num Color:oldColor];

アンドゥを実行すると、

[undoManager undo];

登録したメソッドを以下のように実行してくれる仕組みです。

[self setColorAt:num Color:oldColor];

ひとまずうまく動いているようなので安心していたのですが、instrumentsを使ってメモリ使用量を見ていると、ずっと絵を描いていると徐々にメモリ使用量が増えていくことに気づきました。メモリリークしているのかと思ったのですが、メモリリークは検出されず。

それでcall treeを見ていくと、アンドゥマネージャーが肥大していることが分かりました。
そりゃあ全ての操作を記録していたらメモリを食いますよね。。。

そこでこちらのサイトを参考に上限を設定しました。
ツールはそろった: NSUndoManagerでスタック数の上限を設定する方法
コードはこのような感じです。

undoManager=[[NSUndoManager alloc]init];
[undoManager setLevelsOfUndo:30];

すると、無事メモリ使用量が安定しました。感謝!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です