iOS开发中在block中为什么要__weak和__strong配合使用

iOS开发中block直接强引用和先弱引用再强引用的区别

__weak是为了解决循环引用

如果一个对象A持有了一个block,同时block内又持有了对象A,为了解决循环引用我们要在用__weak修饰完对象A后再去持有它,这样就解决了循环引用。

__strong是为了防止block持有的对象提前释放

看代码:

  - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self dismissViewControllerAnimated:YES completion:nil];

__weak typeof(self) weakSelf = self;
self.block = ^{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"%@", weakSelf);
    });
};
self.block();
}

点击屏幕,当前控制器消失,同时被销毁掉,5秒后打印的weakSelf就是一个(null)。
而我们如果在block内使用__strong后就能保证再打印完strongSelf之后再释放当前控制器。

  - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self dismissViewControllerAnimated:YES completion:nil];

__weak typeof(self) weakSelf = self;
self.block = ^{
    __strong typeof(self) strongSelf = weakSelf;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"%@", strongSelf);
    });
};
self.block();
}

目前也就找到个block内部使用GCD,GCD中使用weakSelf再现了self提前释放的例子。

你可能感兴趣的:(iOS开发中在block中为什么要__weak和__strong配合使用)