繁体   English   中英

我需要强壮自我来保持自我活力,强壮自我真的有效吗?

[英]Do I need a strongSelf in block to keep self alive and does the strongSelf really work?

这就是我学到的:使用self保留块时

  1. 我需要一个weakSelf打破保留周期
  2. 我需要一个strongSelf self ,以防止self在中途变成零

所以我想测试一个strongSelf是否真的可以使self保持活力,如下所示:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    self.test = @"test";
    NSLog(@"%@",self.test);
    __weak typeof(self)weakSelf = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        __strong typeof(weakSelf)strongSelf = weakSelf;
        strongSelf.test = @"newTest";
        NSLog(@"%@",strongSelf.test);
    });
}

- (void)dealloc {
    NSLog(@"dealloc");
}

@end

ViewController将被推入navigationController并立即弹出。 输出是

样品

为什么为空?

还有一个问题,我有一个项目,其中包含大量不包含weakSelf strongSelf ,并且我收到大量11号崩溃的信号。 有关系吗? 是否strongSelf为每个人都添加strongSelf

strongSelf确保如果尚未释放self ,则不会在执行块期间释放它。

如果在创建strongSelf之前自我消失了,它将为零。

您应该检查是否strongSelf确实包含以下内容:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    typeof(weakSelf)strongSelf = weakSelf; // __strong is not needed
    if(strongSelf){
        strongSelf.test = @"newTest";
        NSLog(@"%@",strongSelf.test);
    }
});

块中的代码在延迟3秒后执行。 因此,到这个时候,weakSelf已经为零。 这就是为什么StrongSelf为零

我认为您没有正确解决问题。 使用弱势将打破保留周期,但是此行:

__strong typeof(weakSelf)strongSelf = weakSelf;

在执行块之前,不会捕获对self的强引用。 因此,如果您指向该块之外的VC的指针为nil,则在您击中该块时,VC将被释放,weakSelf将为nil-这意味着您的strongSelf也将为nil。 捕获强引用仅可确保如果您在块的开始处具有较弱的自我,则直到结束时您都将拥有它,并且同时不会取消分配。 但是,如果在程序块开始时weakSelf为零,则strongSelf也将为零。 而且,您不需要将其声明为强内部块,因为根据定义它将是强内部块,因此可以将其替换为:

typeof(weakSelf)strongSelf = weakSelf;

要么

id strongSelf = weakSelf;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM