我有一个CAEAGLLayer的运行循环方法,它使用GCD序列化对共享ivars的访问。
我的绘图代码目前是这样构建的:
- (void)draw {
dispatch_sync(serialDrawingQueue, ^{
@autoreleasepool {
[self drawingStart];
[spriteA draw];
[spriteB draw];
[self drawingEnd];
}
});
}
CADisplayLink调用draw
方法。
我使用GCD块时需要@autoreleasepool
吗?
答案 0 :(得分:21)
来自Apple docs:
如果你的块创建了多个Objective-C对象,你可能会 想要将块的代码部分包含在@autorelease块中 处理这些对象的内存管理。 虽然是GCD 调度队列有自己的自动释放池,他们没有 保证何时排水。如果您的申请是 内存受限,创建自己的自动释放池允许你 以更加规律的间隔释放自动释放对象的内存。
答案 1 :(得分:-1)
似乎在iOS10或更高版本中,调度队列在@autoreleasepool
中默认不再包围块。这由queue.h
DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL
和DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL
宏表示