【问题标题】:Does declaring strongSelf from weakSelf before a block cause retain cycle在块之前从 weakSelf 声明 strongSelf 是否会导致保留周期
【发布时间】:2015-02-03 17:46:43
【问题描述】:

这是有问题的块。我想知道在块之外声明 strongSelf 是否会引入一个保留周期。在块外设置strongSelf的原因是我担心weakSelf会在完成块之前被释放。

__weak CollectionView *weakSelf = self;
    CollectionView *strongSelf = weakSelf;
        [self
         performBatchUpdates:
            ^{
                strongSelf->_cellSet = [strongSelf performDeletions:[strongSelf deletionsTowards:destinationSet from:strongSelf->_cellSet] from:strongSelf->_cellSet];
                [(CollectionViewLayout *)strongSelf.collectionViewLayout setCellSet:strongSelf->_cellSet];
            }
         completion:
            ^(BOOL finished)
            {
                [strongSelf insertTowards:destinationSet];
            }];

【问题讨论】:

  • 是的,它会导致一个保留周期。您应该修复您的代码,以便在调用回调之前不会释放 self

标签: objective-c


【解决方案1】:

你所做的只是毫无意义。 weakSelf 是对 self 的弱引用。 strongSelf 是对 self 的强引用。它被块捕获,因此块现在也对 self 具有强引用(这就是在块中使用weakSelf 时的区别:当块捕获weakSelf 时,块对self 具有弱引用)。与其在块中使用 strongSelf,不如只使用 self 会容易得多 - 这将是完全相同的东西。 可能在您使用 strongSelf 时,编译器会感到困惑,以至于不会给您任何警告,而您在使用 self 时会收到警告(如果该警告是适当的)。

是否导致保留循环:取决于代码。如果两个块的副本存储在对象 self 中,并且在调用完成块时未设置回 nil,则您有一个保留周期。如果这两个块没有存储在任何地方,那么对 self 的强引用最终会消失。

真正奏效的方法是将weakSelf分配给一个强引用strongSelfinside每个块。然后你要做的第一件事就是测试一次 strongSelf 是否为 nil。在这种情况下,您知道 self 已被释放,您需要考虑在这种情况下您想要执行哪些操作。

【讨论】:

  • 如果函数中有两个块,在这种情况下是 batchUpdate 和 completionHandler,如何使用 weakSelf,并确保weakSelf 指针在这两个块之间保持活动状态。跨度>
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多