[英]What is the Objective-C equivalent of 'weak self' in a Swift closure?
[英]Weak self vs self when using closure defined in swift in objective c
假设:-我在objeticve - c
( Number.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.