5

我有一個CAEAGLLayer的運行循環方法,它使用GCD來序列化訪問共享ivars。是否有必要在GCD的ARC下創建自動釋放池?

我的繪製代碼目前被構造是這樣的:

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

      [spriteA draw]; 
      [spriteB draw]; 

      [self drawingEnd]; 
     } 
    }); 
} 

draw方法由CADisplayLink調用。 當我使用GCD塊時,是否需要@autoreleasepool

+0

定義DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOLDISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL宏表示你怎麼樣只是嘗試一下,看看你得到任何「沒有游泳池的地方...只是泄漏!」錯誤消息? –

+1

顯然,最好問問更有經驗的開發人員是否這是個好主意。 –

回答

21

Apple docs

如果你的塊創建比一些Objective-C的對象越多,你可能 要附上你的塊的部分代碼在@autorelease塊 處理內存管理那些對象。 儘管GCD 調度隊列有自己的自動釋放池,但他們沒有做出 的保證,以確定這些池何時耗盡。如果您的應用程序內存受限,您可以創建自己的自動釋放池,讓您以更有規律的間隔爲自動釋放對象釋放內存。

-1

在iOS10或更高版本中,似乎在默認情況下在@autoreleasepool中,調度隊列不再環繞塊。這是由queue.h

相關問題