Как уничтожить ВК после добавления в UIWindow? - PullRequest
1 голос
/ 30 мая 2019

Для определенных типов тестов мне нужно, чтобы контроллер представления находился внутри 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 голосов
/ 30 мая 2019

Накачка цикла выполнения дает пулу автоматического выпуска, так что никакие объекты не задерживаются после завершения теста.Если объекты являются чисто локальными для теста, поместите объекты в пул автоматического выпуска и выполните насос:

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()
}
...