【发布时间】:2017-08-25 22:11:48
【问题描述】:
我正在尝试编写测试来检查保留周期,但遇到了这种奇怪的行为。将视图控制器设置为 nil 时,不会释放 UIViewController 的属性。以这个模拟对象为例:
class BasicViewController: UIViewController {
var someObject = NSObject()
.....
}
它只有一个变量。您会假设调用basicViewController = nil 时会导致someObject 为零,但事实并非如此。
it("releases someObject") {
var controller: MockController? = MockController()
weak var something = controller?.something
expect(controller).toNot(beNil())
controller = nil
expect(controller).to(beNil())
expect(something).to(beNil())
}
it("doesn't release someObject") {
var controller: MockController? = MockController()
weak var something = controller?.something
expect(controller).toNot(beNil())
_ = controller?.view
controller = nil
expect(controller).to(beNil())
expect(something).toNot(beNil())
}
当调用vc.view 时,这会调用loadView 以及UIViewController 的生命周期函数——viewDidLoad、viewDidAppear 和viewWillAppear。我的问题是为什么?为什么当我引用UIViewController 的view 属性时,即使将UIViewController 设置为nil,UIViewController 拥有的所有对象仍然存在。
FWIW,我正在使用 Quick 和 Nimble 进行测试,以及 Swift 3.1
【问题讨论】:
-
但是如果你查看这两个测试,两者之间唯一的区别就是我调用了_ = vc.view,这导致我不得不使用toNot()来使测试通过。这是不希望的。我创建了这个例子来展示即使是最简单的对象也是如何导致这种持久性发生的。没有发生强引用循环,只是一个 NSObject。这让我相信,当与视图交互时,它的控制器属性会持续存在,但最终会在一段时间后被释放。
标签: ios swift memory-leaks ios10