当使用在客观c中的swift中定义的闭包时,弱自我与自我

时间:2017-05-23 02:40:52

标签: ios objective-c iphone swift

让我们说: - 我在ViewControllerobjeticve - c)中创建了Number.m。 我在TableViewCell中创建了swift,其中包含按钮(CalculateSum.swift

现在我需要告诉VC已点击按钮并发送按钮的标签。为此,我使用闭包。

斯威夫特: -

var calculateSumBtnTapped: ((UITableViewCell) -> Void)?

@IBAction func calculateSumBtnDidTapped(_ sender: Any) {
        self.calculateSumBtnTapped?(self)
}

现在我们看到CalculateSum.swift持有strongcalculateSumBtnTapped属性的引用。

现在我将此闭包称为Number.m

中的块
CalculateSum * calculateSum = [tableView dequeueReusableCellWithIdentifier:@"sum" forIndexPath:indexPath];
__block typeof(self) weakSelf = self;
calculateSum.calculateSumBtnTapped = ^(UITableViewCell * _Nonnull calculateSumCell) {
            // calculating sum by tag
      weakSelf.sum = weakSelf.sum + calculateSumCell.tag
};
  

是否有必要使用自我作为弱者?或者我可以使用自己的原样?

2 个答案:

答案 0 :(得分:5)

首先尝试了解什么是retaincycle以及它将如何影响您的应用程序..

retain cycle是两个对象彼此保持强引用时发生的情况。

enter image description here

在这种情况下,这些对象不会被取消分配,它将永远留在内存中并导致内存泄漏。

在块中保留周期,为什么我们应该使用弱自己

闭包和块是独立的内存对象,它们将保留它们引用的对象,因此如果我们使用self访问闭包或块内的任何类变量或方法,那么就有可能保留周期

self.myBlock = ^{ self.someProperty = xyz; }; // RETAIN CYCLE

会收到此警告

  

捕捉自我'在这个区块中强烈反对可能会导致保留   周期

为了避免这种情况,我们应该弱自己来访问成员

__weak typeof(self) weakSelf = self;

`self.myBlock = ^{ weakSelf.someProperty = xyz; };`

所以有一个像always use weakSelf in blocks这样的规则但是有一些特殊情况,比如动画块

[UIView animateWithDuration:duration animations:^{ [self.superview layoutIfNeeded]; }];

这里我们可以在块中使用self,因为一旦动画完成,块会自动被破坏。

答案 1 :(得分:0)

当一个对象A强烈引用另一个对象B而对象B强烈引用对象A时,ARC无法释放两个对象,从而创建保留周期,这可能会增加应用程序的内存占用并可能导致应用程序崩溃。为了避免保留周期,其中一个参考应该是弱的。这就是为什么你需要在块内使用weakSelf。