块如何在非ARC环境中保留变量?

时间:2015-11-22 11:30:14

标签: ios objective-c objective-c-blocks

我维护了一些在非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

1 个答案:

答案 0 :(得分:1)

dispatch_async()将复制传递给它的块,因为它需要该块才能在调用者的范围内存活。该块捕获tImage的值。因此,当复制块时,它会保留指向的UIImage对象。

当然,GCD将确保该块的副本在执行后将被释放。当该块被释放时,它将释放它保留的任何内容。这包括UIImage指向的tImage对象。

因此,就dispatch_async(),GCD和块运行时所做的事情而言,一切都是平衡的。

假设imageLoadBlock()在内存管理方面表现良好,那么代码就没有问题。