5

假设我有一个简单的 call dispatch_async(self.queue, ^{ /* Empty */ })self.queue之前创建的队列在哪里。

在这种情况下是否会被块保留,因为块self没有self引用,而只是作为 ? 的参数?dispatch_async()

4

2 回答 2

2

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.

于 2013-06-25T20:12:00.683 回答
0

不,self如果块既没有(a)任何明确的引用,也不会被保留self;也不 (b)self通过引用 的任何实例变量生成对它的任何隐式引用selfself.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,您将看到视图控制器一直保留到块完成之后。

于 2013-06-25T23:16:32.150 回答