5

簡単な calldispatch_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

このView Controllerのシーンにプッシュし、すぐに「戻る」ボタンを押してポップすると、View Controllerがすぐに割り当て解除され、ブロックの実行が続行されます。しかし、クラスのインスタンス変数またはプロパティを に追加するとblock、ビュー コントローラーはブロックが完了するまで保持されます。

于 2013-06-25T23:16:32.150 に答える