0

我无法弄清楚为什么用 UIStoryboard.instantiateViewController 实例化的 UIViewController 在单元测试中初始化时不会取消初始化

这是我希望 deinit 但没有的代码:

func testDoesNotDeinit() throws {
    var strongViewController: ViewController? =
        UIStoryboard(
            name: "Main",
            bundle: Bundle(for: ViewController.self)
        )
        .instantiateViewController(withIdentifier: "ViewController") as! ViewController

    print("set nil")
    strongViewController = nil
    print("post set nil")
}

结果是:

set nil
post set nil
*** deinit *** // From deinit {} function in UIViewController

当 UIViewController 以编程方式初始化时,它将正确地取消初始化

func testDoesDeinit() throws {
    var strongViewController: ViewController? = ViewController()

    XCTAssertNotNil(strongViewController)
    print("set nil")
    strongViewController = nil
    print("post set nil")
    XCTAssertNil(strongViewController)
}

结果:

set nil
*** deinit *** // From deinit {} function in UIViewController
post set nil

有任何想法吗?

4

1 回答 1

0

我在那个时间点设置了一个断点print("post set nil")并检查了内存图。我看到 VC 被以下实例保留UIStoryboardScene

在此处输入图像描述

UIStoryboardScene似乎是一个私有API。我唯一能找到的就是这个 header。这可能是instantiateViewController.

于 2020-07-22T04:17:55.327 回答