对于某些类型的测试,我需要视图控制器位于UIWindow内部。 UIWindow本身从不显示。我在销毁视图控制器时遇到了麻烦。
说我们有
class MyViewController: UIViewController {
deinit {
print("MyVC bye-bye")
}
}
class MyWindow: UIWindow {
deinit {
print("MyWindow bye-bye")
}
}
现在在测试套件中,我可以同时创建两个对象,并将它们释放。
class MyTests: XCTestCase {
func test() {
let vc = MyViewController()
let window = MyWindow()
}
}
在控制台输出中,我看到
MyWindow bye-bye
MyVC bye-bye
但是,如果我在测试中添加以下行,则不会破坏任何对象。
window.addSubview(vc.view)
以后,自动释放池可能会清除窗口本身。但是我主要担心的是视图控制器没有被破坏。
我尝试做
vc.view.removeFromSuperview()
但这还不够。
答案 0 :(得分:0)
泵送运行循环可让自动释放池发挥作用,因此在测试结束后,没有任何对象会停留。如果这些对象纯粹是测试的本地对象,请将其放置在自动释放池中并执行泵操作:
func test() {
autoreleasepool {
let vc = MyViewController()
let window = MyWindow()
window.addSubview(vc.view)
}
RunLoop.current.run(until: Date())
}
但是在大多数测试套件中,视图控制器是测试夹具的一部分。在这种情况下,请在松开固定装置后泵送回路。
override func tearDown() {
vc = nil
RunLoop.current.run(until: Date())
super.tearDown()
}