繁体   English   中英

使用目标c中的swift定义的闭包时弱的自我与自我

[英]Weak self vs self when using closure defined in swift in objective c

假设:-我在objeticve - cNumber.m )中创建了一个ViewController 我有一个在swift中创建的TableViewCell ,其中包含按钮( CalculateSum.swift

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

斯威夫特:-

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

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

现在,我们看到CalculateSum.swift拥有对calculateSumBtnTapped属性的strong引用。

现在我将此闭包称为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
};

有必要把自我当作弱者吗? 还是我可以按原样使用自我?

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

retain cycle是当两个对象彼此保持强引用时发生的条件。

在此处输入图片说明

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

保持循环成块,为什么我们应该使用软弱的自我

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

self.myBlock = ^{ self.someProperty = xyz; }; //保持循环

会得到这个警告

在此区块中强烈捕获“自我”可能会导致保留周期

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

__weak typeof(self) weakSelf = self;

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

因此,有一个规则,例如always use weakSelf in blocks但是有一些特殊情况,例如动画块

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

这里我们可以在块内使用self,因为一旦动画完成,块会自动销毁。

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

暂无
暂无

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

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