【问题标题】:Swift 3 & iOS 10 false memory leak bugSwift 3 和 iOS 10 错误的内存泄漏错误
【发布时间】:2017-02-14 14:47:30
【问题描述】:

与 iOS 10 和 Swift 3 一起使用时,Xcode 8 中似乎存在(错误的)内存泄漏错误。

以下代码报告了 Instruments 和 Xcode 8 内存调试器中的内存泄漏:

class SomeClass: NSObject {
    var view: SomeView!

    deinit {
        print("SomeClass deinit")
    }
}

class SomeView: UIView {
    weak var reference: SomeClass?

    deinit {
        print("SomeView deinit")
    }
}

class ViewController: UIViewController {
    var someProperty: SomeClass?

    override func viewDidLoad() {
        super.viewDidLoad()

        let c = SomeClass()
        let v = SomeView()
        c.view = v
        v.reference = c

        someProperty = c
    }
}

【问题讨论】:

    标签: xcode memory-leaks swift3 ios10 xcode8


    【解决方案1】:

    我尝试了不同的变体来确认它确实是一个错误,我的发现是:

    1. 当您不将示例代码中的c 分配给someProperty 时,两个实例都将在各自的deinits 中打印字符串。真正的强引用循环不会终止。
    2. SomeClass 不继承自NSObject 时,不会发生此错误。
    3. 使用 Swift 2.2 时,不会发生这种情况。
    4. 使用 iOS 9- 时不会发生这种情况。
    5. 一旦在代码中的某处将someProperty 设置为nil,这两个实例都是deinited。 Xcode 8 内存调试器确认没有内存泄漏。然而,在 Instruments 中,这种变化并没有得到体现——这是正确的,因为可能无法解决真正的内存泄漏。

    仅供参考,仅当它分配给UIViewController 的属性时才会发生这种情况。我最初在单例对象中发现了这种行为。

    【讨论】:

      【解决方案2】:

      iOS 10.3(第一个测试版)和 Xcode 8.3(第一个测试版)似乎已修复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 2018-01-19
        • 2010-11-11
        • 2015-11-08
        相关资源
        最近更新 更多