我维护了一些在非ARC环境中实现的遗留代码。以下代码段中是否存在任何内存管理问题? (也就是说,tImage
保留在块中,永远不会被释放。)
+ (void)noCacheImageWithName:(NSString *)name completion:(imageload_block_t)imageLoadBlock
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *tImage = [UIImage imageWithContentsOfFile:<#image_path#>];
dispatch_async(dispatch_get_main_queue(), ^{
imageLoadBlock(tImage);
});
});
}
更新
我在代码段中提到的block
是主队列中的block
。
答案 0 :(得分:1)
dispatch_async()
将复制传递给它的块,因为它需要该块才能在调用者的范围内存活。该块捕获tImage
的值。因此,当复制块时,它会保留指向的UIImage
对象。
当然,GCD将确保该块的副本在执行后将被释放。当该块被释放时,它将释放它保留的任何内容。这包括UIImage
指向的tImage
对象。
因此,就dispatch_async()
,GCD和块运行时所做的事情而言,一切都是平衡的。
假设imageLoadBlock()
在内存管理方面表现良好,那么代码就没有问题。