簡単な calldispatch_async(self.queue, ^{ /* Empty */ })
があるとします。ここで、self.queue
は以前に作成されたキューです。
self
この場合、ブロック内self
に参照がなく、のパラメーターとしてのみ保持されるため、ブロックによって保持されますか?dispatch_async()
簡単な calldispatch_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
このView Controllerのシーンにプッシュし、すぐに「戻る」ボタンを押してポップすると、View Controllerがすぐに割り当て解除され、ブロックの実行が続行されます。しかし、クラスのインスタンス変数またはプロパティを に追加するとblock
、ビュー コントローラーはブロックが完了するまで保持されます。