让我们说: -
我在ViewController
(objeticve - c
)中创建了Number.m
。
我在TableViewCell
中创建了swift
,其中包含按钮(CalculateSum.swift
)
现在我需要告诉VC已点击按钮并发送按钮的标签。为此,我使用闭包。
斯威夫特: -var calculateSumBtnTapped: ((UITableViewCell) -> Void)?
@IBAction func calculateSumBtnDidTapped(_ sender: Any) {
self.calculateSumBtnTapped?(self)
}
现在我们看到CalculateSum.swift
持有strong
对calculateSumBtnTapped
属性的引用。
现在我将此闭包称为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
};
是否有必要使用自我作为弱者?或者我可以使用自己的原样?
答案 0 :(得分:5)
首先尝试了解什么是retaincycle
以及它将如何影响您的应用程序..
retain cycle
是两个对象彼此保持强引用时发生的情况。
在这种情况下,这些对象不会被取消分配,它将永远留在内存中并导致内存泄漏。
在块中保留周期,为什么我们应该使用弱自己
闭包和块是独立的内存对象,它们将保留它们引用的对象,因此如果我们使用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。