当与 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
}
}
我尝试了不同的变体来确认它确实是一个错误,我的发现是:
- 当你不分配时
c
在示例代码中someProperty
,两个实例都会打印各自的字符串deinit
s。真正的强引用循环不会取消初始化。
- When
SomeClass
不继承自NSObject
,这个错误不会发生。
- 当使用 Swift 2.2 时,这种情况不会发生。
- 使用 iOS 9 时,不会发生这种情况。
- Once
someProperty
被设定为nil
在代码中的某个地方,两个实例都是deinit
编辑。 Xcode 8 内存调试器确认没有内存泄漏。然而在 Instruments 中,这种变化并没有得到反映——这是正确的,因为真正的内存泄漏可能不会得到解决。
仅供参考,只有当它分配给以下属性时才会发生这种情况UIViewController
。我最初是在单例对象中发现这种行为的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)