gpt4 book ai didi

ios - block如何在非ARC环境中保留变量?

转载 作者:行者123 更新时间:2023-11-29 01:27:22 27 4
gpt4 key购买 nike

我维护了一些在非 ARC 环境中实现的遗留代码。以下代码片段中是否存在任何内存管理问题? (即 tImage 保留在 block 中,永远不会被释放。)

+ (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

最佳答案

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

当然,GCD会保证block的副本在执行完后会被释放。当该 block 被释放时,它将释放它保留的所有内容。这包括 tImage 指向的 UIImage 对象。

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

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

关于ios - block如何在非ARC环境中保留变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33854261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com