6

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

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

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

            [spriteA draw];
            [spriteB draw];

            [self drawingEnd];
        }
    });
}

draw方法由 CADisplayLink 调用。@autoreleasepool使用 GCD 块时有必要吗?

4

2 回答 2

23

来自苹果文档

如果您的块创建了多个 Objective-C 对象,您可能希望将块的部分代码包含在 @autorelease 块中,以处理这些对象的内存管理。尽管 GCD 调度队列有自己的自动释放池,但它们不能保证这些池何时耗尽。如果您的应用程序受内存限制,创建您自己的自动释放池可以让您更定期地为自动释放对象释放内存。

于 2012-09-25T16:26:44.560 回答
-1

似乎在 iOS10 或更高版本中,调度队列默认不再围绕@autoreleasepool. 这由DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOLDISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL中定义的宏表示queue.h

于 2017-11-29T00:11:56.990 回答