Как избежать утечек памяти с дочерними viewControllers

представьте себе ViewController, который состоит из нескольких дочерних ViewController, как показано ниже:

ViewController1:
- ViewController2
- ViewController3

ViewController2 не меняется, поэтому он определяется на раскадровке с containerViews. Чтобы получить ссылку на ViewController2 с помощью ViewController1, я делаю следующее:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destination = segue.destination
        if let viewController2 = destination as? ViewController2 {
            self.viewController2 = viewController2
        }
   }

Что касается ViewController3, он динамический, поэтому программно добавляется в ViewController1 следующим образом:

    addChildViewController(viewController3)
    view.addSubview(viewController3.view)
    viewController3.didMove(toParentViewController: self)

Мой вопрос для обоих этих сценариев заключается в том, как правильно обрабатывать управление памятью ссылок viewController2 и viewController3. Должны ли они быть слабыми или сильными ссылками?

Спасибо!


person Bruno Morgado    schedule 05.02.2018    source источник
comment
Пока VC2 и VC3 не имеют строгой ссылки на VC1, эталонный цикл отсутствует. Вместо того, чтобы беспокоиться о несуществующих проблемах, проверьте, действительно ли у вас есть проблема или нет. Используйте инструменты или убедитесь, что deinit вызывается. Как только у вас возникнет актуальная проблема, опубликуйте вопрос с соответствующей спецификой.   -  person rmaddy    schedule 05.02.2018
comment
Почему вы публикуете второй вопрос об утечке памяти через 9 минут после этого? stackoverflow.com/ вопросы/48629539/   -  person dfd    schedule 05.02.2018
comment
Когда вы делаете addChildViewController (или используете его как встроенный контейнер), это сохраняет сильную ссылку на дочерний контроллер. Так что вам не нужно беспокоиться о том, чтобы сохранить свою сильную ссылку на него. Но ты можешь, если хочешь. Но здесь нет сильного референтного цикла.   -  person Rob    schedule 05.02.2018


Ответы (1)


Основное эмпирическое правило состоит в том, чтобы все ссылки в направлении «наружу» были сильными, а ссылки «назад» — слабыми.

В вашем случае ViewController1 является базовым контроллером представления. Он владеет ViewController2 и ViewController3, поэтому эти ссылки должны быть надежными. ViewController2 и ViewController3 указывают назад на контроллер представления 1, поэтому их ссылки должны быть слабыми.

Думайте о графе объектов как о дереве. Он привязан к UIApplication в корне, и все привязано к нему. Объекты, расположенные выше по дереву, должны принадлежать своим корневым объектам, но не должны иметь ссылок на владение своими корневыми объектами.

person Duncan C    schedule 05.02.2018