我有一些我正在过滤的图像,当我在我创建的串行队列中执行此操作时,在每个块完成后释放内存。当我将此工作分派给全局GCD队列时,内存不会释放并失控。
我将语句包装在自动释放块中,但这似乎没什么区别。
是否由于线程池以某种方式保留对块的引用?一段时间后内存被释放,但应用程序将在此之前崩溃,并显示大量图像。
为什么内存由全局队列保存,如何修复以便在每个块之后释放?
答案 0 :(得分:2)
您在评论中提到GCD似乎创建了太多线程,导致过多的图像同时存在于内存中。如果GCD产生“负载线程”,其中负载是> 3x内核数量,这可能意味着您提交给它的块最终被阻止(可能是在I / O上)。更高效的方法是序列化串行队列上的I / O,并且只进行并行内存处理。在这方面从GCD获得帮助的一种方法是使用dispatch_apply
来限制并发操作的数量。 IME dispatch_apply
不会创建超过2 *个核心数的线程。 (虽然这不会考虑可能创建线程的其他并发操作。)
另外,正如您所指出的,NSOperationQueue
允许您指定最大并发任务数,这是另一种方法。