5

私は共有ivarsへのアクセスをシリアライズするためにGCDを使用するCAEAGLLayerの実行ループメソッドを持っています。GCDのARCの下に自動解放プールを作成する必要はありますか?

- (void)draw { 
    dispatch_sync(serialDrawingQueue, ^{ 
     @autoreleasepool { 
      [self drawingStart]; 

      [spriteA draw]; 
      [spriteB draw]; 

      [self drawingEnd]; 
     } 
    }); 
} 

draw方法がCADisplayLinkによって呼び出されます。

私の描画コードは、現在このように構成されています。 GCDブロックを使用する場合、@autoreleasepoolは必要ですか? Apple docsから

+0

あなたは「プールがありません...ただ漏れていますか?エラーメッセージ? –

+1

明らかに、より経験豊かな開発者に尋ねる方が良いでしょうか、これは良い考えです。 –

答えて

21

あなたのブロックを超える数のObjective-Cのオブジェクトを作成した場合、あなたは のためのメモリ管理を扱う に@autoreleaseブロックにあなたのブロックのコードの一部を囲むする場合がありますそれらのオブジェクト。 GCD ディスパッチキューには独自の自動解放プールがありますが、これらのプールが排水された時点については、 の保証はありません。アプリケーションが のメモリが制約されている場合は、独自の自動解放プールを作成すると、より定期的に自動解放されたオブジェクトのメモリを解放することができます( )。

-1

iOS10以降のディスパッチキューでは、ブロックがデフォルトで@autoreleasepoolに囲まれていないようです。これは、DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOLDISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOLのマクロで定義されています。queue.h

関連する問題