是否有必要在GCD中的ARC下创建自动释放池?

时间:2012-09-25 16:14:25

标签: ios memory-management concurrency automatic-ref-counting grand-central-dispatch

我有一个CAEAGLLayer的运行循环方法,它使用GCD序列化对共享ivars的访问。

我的绘图代码目前是这样构建的:

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

            [spriteA draw];
            [spriteB draw];

            [self drawingEnd];
        }
    });
}

CADisplayLink调用draw方法。 我使用GCD块时需要@autoreleasepool吗?

2 个答案:

答案 0 :(得分:21)

来自Apple docs

  

如果你的块创建了多个Objective-C对象,你可能会   想要将块的代码部分包含在@autorelease块中   处理这些对象的内存管理。 虽然是GCD   调度队列有自己的自动释放池,他们没有   保证何时排水。如果您的申请是   内存受限,创建自己的自动释放池允许你   以更加规律的间隔释放自动释放对象的内存。

答案 1 :(得分:-1)

似乎在iOS10或更高版本中,调度队列在@autoreleasepool中默认不再包围块。这由queue.h

中定义的DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOLDISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL宏表示