我是否需要一个强大的自我来保持自我活力并且强大的自我真的有效吗?

时间:2015-03-17 07:42:04

标签: ios objective-c block retain-cycle

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

  1. 我需要一个weakSelf来打破保留周期
  2. 我需要strongSelf来阻止self成为零中途
  3. 所以我想测试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并立即弹出。输出是

    sample

    为什么空?

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

3 个答案:

答案 0 :(得分:1)

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);
    }
});

答案 1 :(得分:0)

块中的代码在3秒延迟后执行。所以到了这个时候,弱者自己已经是零了。这就是为什么strongSelf是零的原因

答案 2 :(得分:0)

我认为你没有解决问题。使用weakself将打破保留周期,但是这一行:

__strong typeof(weakSelf)strongSelf = weakSelf;

在执行块之前,不捕获对self的强引用。因此,如果您在块之外的VC指针为nil,则VC将被释放,当您点击块时,weakSelf将为零 - 这意味着您的strongSelf也将为零。捕获强大的参考仅保证如果你在块的开始处有弱自我,你将拥有它直到结束并且它不会同时是dealloc。但是如果在块的开始时weakSelf为零 - strongSelf也将为零。此外,您不需要将其声明为强大的内部块,因为它将根据定义强大,因此可以替换为:

typeof(weakSelf)strongSelf = weakSelf;

id strongSelf = weakSelf;