在GCD下,使用ARC是否需要创建自动释放池?

6

我有一个运行循环方法,用于CAEAGLLayer,并使用GCD对共享的ivars进行串行访问。

我的绘图代码目前构建如下:

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

            [spriteA draw];
            [spriteB draw];

            [self drawingEnd];
        }
    });
}

draw方法由CADisplayLink调用。当我使用GCD块时,@autoreleasepool是必需的吗?


你为什么不试一下,看看是否会出现“没有池可用...正在泄漏!”的错误信息? - Jeremy W. Sherman
2
显然,询问更有经验的开发人员是否这是一个好主意会更好。 - Proud Member
2个回答

23

来自苹果文档

如果您的块创建了超过几个Objective-C对象,您可能需要将块代码的某些部分放入@autorelease块中以处理这些对象的内存管理。虽然GCD调度队列有自己的autorelease池,但它们不能保证何时会清空这些池。如果您的应用程序受到内存限制,创建自己的autorelease池可以让您在更规律的时间间隔内释放用于自动释放的对象的内存。


更准确地说,请参考Quinn在https://developer.apple.com/forums/thread/114025中的回答:“如果这些块创建了自动释放池的流量,那么只有在工作线程终止时才会释放,如果还有工作要做,这可能需要一些时间”。因此建议使用DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL。 - undefined

-1
似乎在iOS10及以上版本中,默认情况下不再使用@autoreleasepool包围块。这可以通过queue.h文件中定义的DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOLDISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL宏来指示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接