5

Ho un metodo ciclo di esecuzione per un CAEAGLLayer che utilizza GCD per serializzare l'accesso ai ivars condivisi.È necessario creare un pool di autorelease sotto ARC in GCD?

mio codice di disegno attualmente è costruito in questo modo:

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

      [spriteA draw]; 
      [spriteB draw]; 

      [self drawingEnd]; 
     } 
    }); 
} 

Il metodo draw viene chiamato da un CADisplayLink. È necessario il @autoreleasepool quando utilizzo i blocchi GCD?

+0

Che ne dici di provarlo e vedere se si ottiene "nessuna piscina sul posto ... solo perdite!" messaggio di errore? –

+1

Ovviamente è meglio chiedere agli sviluppatori più esperti che questa sia o meno una buona idea. –

risposta

21

Dal Apple docs:

Se il blocco crea più di un paio di oggetti Objective-C, si potrebbe voler racchiudere le parti del codice del blocco in un blocco @autorelease al gestire la gestione della memoria per quegli oggetti. Sebbene le code di invio GCD abbiano il proprio pool di autorelease, non forniscono alcuna garanzia in merito a quando tali pool vengono scaricati. Se la tua applicazione è limitata alla memoria , la creazione del tuo pool autorelease ti consente di liberare la memoria per gli oggetti autoreleased a intervalli più regolari, a .

-1

sembra che in iOS10 o superiore code di invio non più Surround blocca per impostazione predefinita in @autoreleasepool. Questo è indicato dai macro DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL e DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL definiti in queue.h

Problemi correlati