【问题标题】:Do I need a strongSelf in block to keep self alive and does the strongSelf really work?我是否需要一个 strongSelf 来让自己保持活力,strongSelf 真的有效吗?
【发布时间】:2015-03-17 07:42:04
【问题描述】:

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

  1. 我需要一个 weakSelf 来打破保留周期
  2. 我需要一个 strongSelf 来防止 self 中途变为 nil

所以我想测试一下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

【问题讨论】:

    标签: ios objective-c block retain-cycle


    【解决方案1】:

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

    如果在你创建 strongSelf 之前 self 已经消失了,它将是 nil。

    您应该检查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);
        }
    });
    

    【讨论】:

      【解决方案2】:

      您的代码块中的代码在 3 秒延迟后执行。所以这个时候weakSelf已经为零了。这就是为什么 strongSelf 是 nil

      【讨论】:

        【解决方案3】:

        我认为您没有正确解决问题。使用weakself会破坏retain循环,但是这一行:

        __strong typeof(weakSelf)strongSelf = weakSelf;
        

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

        typeof(weakSelf)strongSelf = weakSelf;
        

        id strongSelf = weakSelf;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-02
          • 1970-01-01
          • 2019-03-06
          • 1970-01-01
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多