Swift 3和iOS 10虚假内存泄漏错误

fun*_*ct7 5 xcode memory-leaks swift3 ios10 xcode8

在使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

fun*_*ct7 3

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

  1. 当您不在c示例代码中分配给时someProperty,两个实例都会在各自的 s 中打印该字符串deinit。真正的强引用循环不会取消初始化。
  2. SomeClass不继承自时NSObject,不会发生此错误。
  3. 当使用 Swift 2.2 时,这种情况不会发生。
  4. 使用 iOS 9 时,不会发生这种情况。
  5. 一旦someProperty设置为nil代码中的某个位置,两个实例都会被deinit编辑。Xcode 8 内存调试器确认没有内存泄漏。然而在 Instruments 中,这种变化并没有得到反映——这是理所当然的,因为真正的内存泄漏可能不会得到解决。

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