【问题标题】:Memory usage increases if block is run in a queue如果块在队列中运行,内存使用量会增加
【发布时间】:2016-01-19 15:09:19
【问题描述】:

我创建了一个队列

dispatch_queue_t serialq = dispatch_queue_create("com.osletek.hill-billy", DISPATCH_QUEUE_SERIAL);

并将我的积木放入计时器事件中,我的内存使用量不断上升:

-(void) onTimer
{
 __weak typeof(self) this = self;
 dispatch_async(serialq, ^{
  UIImage *img = [this screenShot];
  // do something with img ...
 });
}
}

没有队列,它工作正常:

-(void) onTimer
{
 __weak typeof(self) this = self;

  UIImage *img = [this screenShot];
  // do something with img ...

}
}

我正在使用 ARC。

看起来如果 img 对象在队列中,它不会被释放。

我该如何解决这个烂摊子?

【问题讨论】:

  • 尝试用@autoreleasepool{}封装队列中的代码
  • @autoreleasepool {} 没有帮助。最终有帮助的是删除 UIImage 相关代码并改用 CGImageRef。如果不在主线程中使用 UIImage 确实会导致内存保留问题。

标签: objective-c memory-management objective-c-blocks


【解决方案1】:

在队列中运行时没有定义的自动释放池。有一个计时器触发。

因此,将您的代码更改为:

__weak typeof(self) this = self;
   dispatch_async(serialq, ^{
      @autorelease {
          UIImage *img = [this screenShot];
          // do something with img ...
      }
    });
}

UIImage 在非主线程中使用时不应引起问题,并且文档明确说明了这一点。如果这仍然显示内存增加,我建议您使用分配工具找出原因和原因。

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2018-08-20
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多