gpt4 book ai didi

ios - block 和内存泄漏

转载 作者:行者123 更新时间:2023-11-28 17:54:42 26 4
gpt4 key购买 nike

我正在使用以下代码异步下载图像并将其设置为 ImageView 。

dispatch_queue_t callerQueue = dispatch_get_current_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("com.myapp.processsmagequeue", NULL);
dispatch_async(downloadQueue, ^{
NSData * imageData = [NSData dataWithContentsOfURL:url];

dispatch_async(callerQueue, ^{

self.imageView.image = [UIImage imageWithData:imageData];
[self.imageActivityIndicatorView setHidden:YES];
[self.imageView setHidden:NO];
});
});
dispatch_release(downloadQueue);

我知道这些 block 会自动保留它们引用的所有值,然后释放它们。但是 self 可以在移动到 downloadQueue 然后转移回 callerQueue 之间释放吗?

最佳答案

这应该没问题。

dispatch_async(downloadQueue, ^{ // --> downloadQueue will add a retain on self when it's created
dispatch_async(callerQueue, ^{ // --> callerQueue will add a retain on self when it's created
...
}); // --> callerQueue will release it's retain when it gets dealloced just after returning from here
// --> downloadQueue will release it's retain when it gets dealloced just after returning from here
});

下面是它的执行方式:

  1. downloadQueue 在自身上添加保留//+1
  2. downloadQueue 开始执行 block //+1
  3. callerQueue 在自身上添加保留//+2
  4. downloadQueue 释放它的保留//+1
  5. callerQueue 开始执行内部 block //+1
  6. callerQueue 释放它的保留。//+0

所以,在任何时候,self 上都会有一个 retainCount。顺便说一句,您可以随时使用 -[NSObject retainCount] 检查甚至检查保留计数。

作为旁注,为什么不使用 dispatch_get_main_queue() 而不是保存 callerQueue。您应该永远不要在任何其他线程上执行 UI 操作。如果您的函数是从任何其他线程调用的,这会更安全。

关于ios - block 和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16206410/

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