【发布时间】:2013-04-25 04:29:54
【问题描述】:
我正在使用以下代码异步下载图像并将其设置为图像视图。
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);
我知道这些块会自动保留它们引用的所有值,然后释放它们。但是 self 可以在移动到 downloadQueue 和传输回 callerQueue 之间释放吗?
【问题讨论】:
-
不,这样就可以了。 self 将由 downloadQueue 保留,然后由 callerQueue 保留,然后由 downloadQueue 释放,然后由 callerQueue 释放(很可能按此顺序)。
-
@eddardstark 如果您不使用 ARC,那么您不必担心这样的事情。保留和释放只有在您指示他们这样做时才会发生。
-
这样的事情怎么样..无论什么原因,下载队列都会卡住大约 5 分钟。并且在那个自我之中被释放。现在在这种情况下..在转移到呼叫者队列或后记之前下载队列是否会释放自我?这就是困扰我的地方。
-
@H2CO3 如果我没记错的话,ARC不会处理任何派送和CG案件。
-
@thoughtbreaker 但是这里没有 ARC!阅读第二条评论...
标签: ios objective-c memory-management memory-leaks objective-c-blocks