1

我有许多要过滤的图像,当我在创建的串行队列中执行此操作时,每个块完成后都会释放内存。当我将这项工作分派到全局 GCD 队列时,内存不会释放并失去控制。

我将语句包装在一个自动释放块中,但这似乎没有什么不同。

是因为线程池以某种方式保持对块的引用吗?一段时间后内存被释放,但在此之前应用程序会因大量图像而崩溃。

为什么内存被全局队列保留,如何解决这个问题,以便在每个块后释放?

4

1 回答 1

2

您在评论中提到 GCD 似乎创建了太多线程,导致太多图像一次在内存中。如果 GCD 正在产生“线程负载”,其中负载大于 3 倍内核数,则可能意味着您提交给它的块最终被阻塞(可能在 I/O 上)。一种更高效的方法是在串行队列上序列化 I/O,并且仅并行执行内存中的处理。在这方面从 GCD 获得帮助的一种方法是使用dispatch_apply它将限制并发操作的数量。IMEdispatch_apply不会创建超过 2 * number-of-cores 线程。(尽管这不考虑其他可能创建线程的并发操作。)

此外,正如您所指出的,NSOperationQueue允许您指定最大并发任务数,这是另一种方法。

于 2013-11-03T18:51:08.333 回答