11

ユーザーが突然アプリを終了したときに通常発生する可能性のある操作がまだ実行されている場合に備えて、ivar NSOperationQueue の割り当てを解除する適切な方法を知りたいです。いくつかの例では、次のように、waitUntilAllOperationsAreFinished が使用されているのを見ました。


- (void)dealloc {
    [_queue cancelAllOperations];
    [_queue waitUntilAllOperationsAreFinished];
    [_queue release];
    ...

ただし、実行ループがハングアップするため、多くの人がそうしないように提案しています。では、を解放する適切な方法は何_queueですか? 操作が完了するのを待たずにリリースを続行するとどうなりますか?

4

1 に答える 1

10

ほとんどの場合、電話cancelAllOperationsで十分です。電話をかける必要があるのwaitUntilAllOperationsAreFinishedは、先に進む前にこれらの操作が実行されていることを実際に確認する必要がある場合のみです。

たとえば、操作が共有メモリにアクセスしている場合にこれを行うことができます。待機しないと、2つのスレッドが同時にその共有メモリに書き込むことになります。ただし、メソッドでブロッキング遅延を発生させることによって共有メモリを保護する合理的な設計は考えられませんdealloc。利用可能なはるかに優れた同期メカニズムがあります。

つまり、簡単な答えは次のとおりです。アプリケーションで特に必要な理由がない限り、すべての操作が完了するのを待つ必要はありません。

于 2011-01-15T18:09:47.563 に答える