web-dev-qa-db-ja.com

GCDのブロック内にNSAutoreleasePoolを作成する必要がありますか?

通常、バックグラウンドスレッドを生成したり、NSOperationQueueでNSOperationを実行したりする場合、デフォルトでは何も存在しないため、そのスレッドまたは操作用のNSAutoreleasePoolを作成する必要があります。

同じルールがGrand Central Dispatchキュー内に配置され、非メインスレッドで実行されるブロックに適用されますか?つまり、メインキュー以外にディスパッチする各ブロック内にNSAutoreleasePoolを作成する必要がありますか?

私の限られたテストでは、バックグラウンドスレッドまたはNSOperationsで通常表示される自動解放オブジェクトのコンソール警告は表示されません。しかし、私はこれについての明確なドキュメントを見つけることができないようですので、これが述べられている場所を誰かが指摘できるかどうか疑問に思いました。

73
Brad Larson

Grand Central Dispatchキュー内に配置され、非メインスレッドで実行されるブロックにも同じルールが適用されますか?つまり、メインキュー以外にディスパッチする各ブロック内にNSAutoreleasePoolを作成する必要がありますか?

グランドセントラルディスパッチは、キューごとに自動解放プールを自動的に管理します。ただし、プールがいつ排出されるかについての保証はありません。 1つのブロックが処理された後の場合もあれば、数百後になった場合もあります(おそらく処理されません)。

したがって、いくつかのオブジェクトを割り当てるだけの場合は、心配する必要はありません。ただし、かなりの数のオブジェクトを割り当てる場合(およびメモリに制約のある環境を対象にしている場合)、プールを作成して排出する必要があります。


ドキュメントが更新されました。

https://developer.Apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//Apple_ref/doc/uid/TP40008091-CH102-SW1 を参照してください

ブロックがいくつかのObjective-Cオブジェクトを作成する場合、それらのオブジェクトのメモリ管理を処理するために、ブロックのコードの一部を@autoreleaseブロックで囲むことができます。 GCDディスパッチキューには独自の自動解放プールがありますが、それらのプールがいつ排出されるかは保証されません。アプリケーションのメモリに制約がある場合は、独自の自動解放プールを作成すると、自動解放されたオブジェクトのメモリをより一定の間隔で解放できます。

109
bbum