11

かなり時間がかかり、バックグラウンドで実行する必要があるタスクがあります。ドキュメントによると、これはNSOperationQueue. NSOperationQueueただし、実際にはその 1 つのタスクにしか使用しないため、 のクラス グローバル コピーを保持したくありません。したがって、自動リリースに設定し、タスクが完了する前にリリースされないことを願っています。できます。
このような:

NSInvocationOperation *theTask = [NSInvocationOperation alloc];
theTask = [theTask initWithTarget:self
                         selector:@selector(doTask:)
                           object:nil];
NSOperationQueue *operationQueue = [[NSOperationQueue new] autorelease];
[operationQueue addOperation:theTask];
[theTask release];

なんか気になるけど。これは動作することが保証されていますか? またはoperationQueue、ある時点で割り当てが解除され、それを引き継ぐ可能性がありますtheTaskか?

4

4 に答える 4

5

NSOperationQueue が解放されたときに何が起こるかについて、ドキュメントには何も記載されていません。theTask が実行されるという保証はないと想定するのが最も安全です。

于 2010-03-23T18:45:47.620 に答える
1

NSOperationQueue は解放されたときにタスクを解放すると推測していましたが、タスクを追加した直後にキューを解放しても、タスクが完了して解放されることに気付きました。とは言っても、私はその振る舞いに頼るとは思いません。インスタンス変数は、キューの他のメソッド (cancelAllOperations、setSuspended など) を呼び出す方法を提供します。

于 2010-03-23T18:17:54.727 に答える
1

[NSOperation mainQueue]自動解放を心配する必要がないように、オブジェクトを使用できませんか? 私にとって最も理にかなっていると思われるタスクを1つだけ追加する必要がある場合。

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004592-RH2-SW21

于 2010-03-23T18:44:50.323 に答える
1

動作中に NSOperationQueue を解放しても安全であるという保証はありません。おそらく安全で、この保証はいつか追加されると思いますが、現在はありません。ただし、同等の Grand Central Dispatch API、キューの使用が終了したときにキューを安全に解放できることを保証し、必要な限り保持します。したがって、GCD を備えたプラットフォームを使用している場合は、それを使用して、その間に爆発しないようにすることができます。

または、キューが終了したかどうかを確認し、キューが終了したときにキューとそれ自体の両方を解放するラッパー クラスを作成することもできます。

于 2010-03-23T18:45:42.347 に答える