我正在嘗試編寫測試來檢查保留週期,但遇到了這種奇怪的行爲。當將視圖控制器設置爲nil
時,A UIViewController
的屬性不會取消分配。以此模擬對象爲例: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。它讓我相信,當與視圖交互時,控制器的屬性會持續存在,但最終會在一段時間後解除分配。 – jsetting32