【问题标题】:Why Swift don't automatically handle memory leaks?为什么 Swift 不会自动处理内存泄漏?
【发布时间】:2020-03-28 14:28:49
【问题描述】:

当我开始开发 Swift 代码时,我并没有处理内存泄漏的经验,所以我需要一些时间来弄清楚什么是保留周期,什么是 ARC,以及为什么我应该使用 weak 或 @ 987654322@ 在我的闭包中创建了这些保留周期。

默认情况下,我总是将这段代码添加到引用自身的闭包中:

class MyController: UIViewController {
    var myClosure: (Data?, Error?)?

    override viewDidLoad() {
        self.myClosure = { [weak self] (data, err) in 
            guard let self = self else { return }
            self.present(someVC, animated: true)
        }
    }
}

该代码非常常见,使用此 weak 修饰符以及展开 self 几乎是默认代码。

这让我产生疑问。如果我必须始终在引用 self 的代码中添加 weak self 并且不允许该类被 deinit 为什么 Apple 不将其作为语言的默认行为,因此我们不需要重复此代码在我们的代码库中无处不在?

【问题讨论】:

  • 这个 UX 肯定还有一些改进的余地,但从根本上说,自动化这个需要硬编码到编译器中,假设当 selfnil 时会发生什么。在你的情况下,你只是没有操作。这可能是最常见的有效案例,但我想还有其他案例。

标签: swift automatic-ref-counting retain-cycle


【解决方案1】:

在闭包中引用 self 时,您不必总是使用 weak self

但在这种特殊情况下,您必须这样做,它是explained here

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 2011-10-25
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2013-07-12
    相关资源
    最近更新 更多