美文网首页OC 底层codeER.teciOS学习专题
iOS开发中在block中为什么要__weak和__strong

iOS开发中在block中为什么要__weak和__strong

作者: 梁森的简书 | 来源:发表于2020-04-02 15:23 被阅读0次

    __weak是为了解决循环引用

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

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

    看代码:

      - (void)touchesBegan:(NSSet<UITouch *> *)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<UITouch *> *)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

        本文链接:https://www.haomeiwen.com/subject/lvsxphtx.html