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

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操作。如果从任何其他线程调用您的函数,这只是更安全。

10-06 04:58