J'ai une méthode de boucle d'exécution pour un CAEAGLLayer qui utilise GCD pour sérialiser l'access aux ivars partagés.
Mon code de dessin est actuellement construit comme ceci:
- (void)draw { dispatch_sync(serialDrawingQueue, ^{ @autoreleasepool { [self drawingStart]; [spriteA draw]; [spriteB draw]; [self drawingEnd]; } }); }
La méthode draw
est appelée par un CADisplayLink. Le @autoreleasepool
est- @autoreleasepool
nécessaire lorsque j'utilise des blocs GCD?
À partir des documents Apple :
Si votre bloc crée plus de quelques objects Objective-C, vous pouvez inclure des parties du code de votre bloc dans un bloc @autorelease pour gérer la memory management de ces objects. Bien que les files d'attente de répartition GCD aient leurs propres pools de libération automatique , elles ne garantissent pas le moment où ces pools sont vidés. Si votre application est limitée en memory, la création de votre propre pool de libération automatique vous permet de libérer de la memory pour les objects autoreleased à des intervalles plus réguliers.
Il semble que dans iOS10 ou supérieur, les files d'attente d'expédition n'entourent plus les blocs par défaut dans @autoreleasepool
. Ceci est indiqué par les macros DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL
et DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL
définies dans queue.h