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

时间:2016-10-06 01:30:56

标签: xcode memory-leaks swift3 ios10 xcode8

在使用iOS 10& E时,Xcode 8中似乎存在(错误的)内存泄漏错误。斯威夫特3。

以下代码报告了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
    }
}

2 个答案:

答案 0 :(得分:3)

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

  1. 如果您未将示例代码中的c分配给someProperty,则两个实例都会在各自的deinit中打印该字符串。一个真正强大的参考周期不会消失。
  2. SomeClass未从NSObject继承时,此错误不会发生。
  3. 使用Swift 2.2时,这不会发生。
  4. 使用iOS 9-时,这不会发生。
  5. 在代码中的someProperty设置为nil后,两个实例均为deinit。 Xcode 8内存调试器确认没有内存泄漏。然而,在仪器中,这种变化并没有得到反映 - 这是正确的,因为真正的内存泄漏可能无法得到解决。
  6. 仅供参考,仅当它被分配到UIViewController的属性时才会发生这种情况。我最初在单个对象中发现了这种行为。

答案 1 :(得分:0)

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