我有许多要过滤的图像,当我在创建的串行队列中执行此操作时,每个块完成后都会释放内存。当我将这项工作分派到全局 GCD 队列时,内存不会释放并失去控制。
我将语句包装在一个自动释放块中,但这似乎没有什么不同。
是因为线程池以某种方式保持对块的引用吗?一段时间后内存被释放,但在此之前应用程序会因大量图像而崩溃。
为什么内存被全局队列保留,如何解决这个问题,以便在每个块后释放?
我有许多要过滤的图像,当我在创建的串行队列中执行此操作时,每个块完成后都会释放内存。当我将这项工作分派到全局 GCD 队列时,内存不会释放并失去控制。
我将语句包装在一个自动释放块中,但这似乎没有什么不同。
是因为线程池以某种方式保持对块的引用吗?一段时间后内存被释放,但在此之前应用程序会因大量图像而崩溃。
为什么内存被全局队列保留,如何解决这个问题,以便在每个块后释放?
您在评论中提到 GCD 似乎创建了太多线程,导致太多图像一次在内存中。如果 GCD 正在产生“线程负载”,其中负载大于 3 倍内核数,则可能意味着您提交给它的块最终被阻塞(可能在 I/O 上)。一种更高效的方法是在串行队列上序列化 I/O,并且仅并行执行内存中的处理。在这方面从 GCD 获得帮助的一种方法是使用dispatch_apply
它将限制并发操作的数量。IMEdispatch_apply
不会创建超过 2 * number-of-cores 线程。(尽管这不考虑其他可能创建线程的并发操作。)
此外,正如您所指出的,NSOperationQueue
允许您指定最大并发任务数,这是另一种方法。