假设我有一个简单的 call dispatch_async(self.queue, ^{ /* Empty */ })
,self.queue
之前创建的队列在哪里。
在这种情况下是否会被块保留,因为块内self
没有self
引用,而只是作为 ? 的参数?dispatch_async()
假设我有一个简单的 call dispatch_async(self.queue, ^{ /* Empty */ })
,self.queue
之前创建的队列在哪里。
在这种情况下是否会被块保留,因为块内self
没有self
引用,而只是作为 ? 的参数?dispatch_async()
Ok, so apple docs states that
The queue is retained by the system until the block has run to completion.
So the queue will be retained by the system until the block completes the execution, but the self
won't be retained in this case.
Thanks to @Wain for pointing out my mistake in the previous version of this answer.
不,self
如果块既没有(a)任何明确的引用,也不会被保留self
;也不 (b)self
通过引用 的任何实例变量生成对它的任何隐式引用self
。self.queue
调用中的存在dispatch_async
不会导致它被保留。重要的是块内的内容。
这很容易证明。想象一个视图控制器,其实现如下所示:
@interface SecondViewController ()
@property (nonatomic, strong) dispatch_queue_t queue;
@end
@implementation SecondViewController
- (void)dealloc
{
NSLog(@"%s", __FUNCTION__);
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.queue = dispatch_queue_create("com.stackoverflow.17306228", 0);
void (^block)(void) = ^(void){
sleep(10);
NSLog(@"%s", __FUNCTION__);
};
dispatch_async(self.queue, block);
}
@end
如果你推到这个视图控制器的场景,然后立即按下“返回”按钮将其弹出,你会看到视图控制器立即被释放,块将继续执行。但是,如果您向 中添加类实例变量或属性block
,您将看到视图控制器一直保留到块完成之后。