添加到UIWindow后如何销毁VC?

时间:2019-05-30 04:55:31

标签: memory-leaks uiviewcontroller xctest uiwindow

对于某些类型的测试,我需要视图控制器位于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()

但这还不够。

1 个答案:

答案 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()
}