2012-02-29 12 views
2

私のアプリケーションでNSOperationを使用しています。 別の操作を作成するときに、以前に実行していた操作を取り消しています。しかし、以前に作成された操作のdeallocメソッドは、その操作をキャンセルするときに呼び出されません。キャンセル操作時にNSOperation deallocが呼び出されない

Plsが私に示唆しています。おかげさまで だけで結構です

+0

'dealloc' **が決して呼び出されない限り、操作をキャンセルしても解除して解放するわけではありません。解除する必要はありません –

答えて

1

Responding to the Cancel Command

あなたがキューに操作を追加すると、操作があなたの 手からです。キューは、そのタスクのスケジューリングを処理して処理します。たとえば、ユーザが 進行状況パネルでキャンセルボタンを押すか、アプリケーションを終了するなどの理由で 操作を実行したくない場合は、 操作をキャンセルして不要なCPU時間を消費します。 これを行うには、操作オブジェクト自体のキャンセルメソッドを呼び出すか、または NSOperationQueueクラスのcancelAllOperationsメソッドを呼び出します。

操作をキャンセルしても、直ちにその内容を停止させることはありません。 isCancelledによって返された値はすべての操作がであると予想されますが、このメソッドで返された値 を明示的にチェックし、必要に応じて中止する必要があります。 NSOperationのデフォルトの 実装には、キャンセルのチェックが含まれています。 たとえば、開始メソッドが と呼ばれる前に操作をキャンセルすると、startメソッドはタスクを開始せずに終了します。

deallocメソッドは、他のオブジェクトがそれを使用していないときにオブジェクトの保持カウントが0になったときに呼び出されます。

+0

しかし、私はdeallocする必要があります動作がキャンセルされた場合。それは多くのメモリを必要とするからです。 – Bharathi

+0

deallocは決して呼び出してはいけません。カスタムコードでisCancelledプロパティを定期的にチェックし、操作を中止し、スペースをクリーンアップし、必要に応じて中止する必要があります。 –

3

私は、isFinishedがYESを返し、isExecutingが取り消し後にNOを返す必要があると思います。それ以外の場合、操作オブジェクトは決して解放されません。

ドキュメントが言います。操作がキャンセルされたときに、単純に終了することに加え

、あなたが適切な 最終状態に取り消した操作を動かすことも重要 です。具体的には、isFinished の値とisExecutingプロパティを自分で管理している場合(おそらく が同時操作を実装しているため)、 の変数を更新する必要があります。具体的には、 によって返される値をYESに、isExecutingによってNOに返される値をNOに変更する必要があります。 が実行を開始する前に操作がキャンセルされた場合でも、これらの変更を行う必要があります。

関連する問題