我正在使用以下代码异步下载图像并将其设置为图像视图。
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);
我知道这些块会自动保留它们引用的所有值,然后释放它们。但是在移动到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
});
它的执行方式如下:
downloadQueue添加保留自身// +1
downloadQueue开始执行块// +1
callerQueue增加了对自己的保留// // 2
downloadQueue释放它的保留// +1
callerQueue开始执行内部块// +1
callerQueue释放它的保留权。 // +0
因此,在任何时候,都会在self上保留一个count。顺便说一句,您甚至可以随时使用
-[NSObject retainCount]
检查保留计数。附带说明一下,为什么不使用
dispatch_get_main_queue()
而不是保存callerQueue。您永远不要在任何其他线程上执行UI操作。如果从任何其他线程调用您的函数,这只是更安全。