【问题标题】:Is it necessary to create an autorelease pool under ARC in GCD?GCD中ARC下是否需要创建自动释放池?
【发布时间】:2012-09-17 04:59:51
【问题描述】:

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

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

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

            [spriteA draw];
            [spriteB draw];

            [self drawingEnd];
        }
    });
}

draw 方法由 CADisplayLink 调用。 使用 GCD 块时是否需要 @autoreleasepool

【问题讨论】:

  • 你试试看是否有任何“没有游泳池……只是漏水!”错误信息?
  • 显然,最好问问更有经验的开发人员,这是否是个好主意。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    来自Apple docs

    如果你的代码块创建了多个 Objective-C 对象,你可能会 想要将部分代码块包含在 @autorelease 块中以 处理这些对象的内存管理。 虽然 GCD 调度队列有自己的自动释放池,他们没有 保证这些池何时耗尽。如果您的应用程序是 内存受限,创建自己的自动释放池允许您 定期为自动释放的对象释放内存。

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多