ViewController в стеке навигации не деиницируется при извлечении, что приводит к утечке памяти - PullRequest
0 голосов
/ 10 апреля 2019

В моем приложении есть RootViewController, из которого все мои ViewControllers имеют подклассы.При разработке я обычно использую это в моем RootVC:

deinit { 
    print("\(type(of: self)) deinit")
}

, чтобы я всегда мог видеть, когда любой из моих viewControllers деиницируется.Он печатает:

MyExampleViewController deinit

Сегодня я заметил, что один из них не deinit, когда я отошел от него.Давайте назовем это DetailViewController.Это совершенно нормальный (Root) подкласс ViewController, помещенный в основной NavigationController.Когда вы нажимаете Back button в навигации, он уходит, но никогда не говорит, что он определен.Это первый выдвинутый контроллер, поэтому я не могу открыть контроллер раньше, чтобы посмотреть, поможет ли это.Но любой контроллер нажимает после того, как DetailViewController прекрасно обходится при навигации назад и вперед.

Я решил проверить график памяти, поэтому я снова запустил свое приложение, выдвинув на DetailViewController, затем вытолкнул его, нажав Back button в навигации, затем я нажал График отладочной памяти .

В отладочном навигаторе слева я прокручиваю вниз и вижу, что существует один экземпляр моего DetailViewController.Если я несколько раз нажимаю взад-вперед, прежде чем открывать график памяти, я вижу столько раз, сколько раз я DetailViewController нажимаю и нажимаю.

При нажатии на него я вижу следующее:

Memory Graph DetailViewController - единственный контроллер в крайнем правом углу.Я не так много использовал Memory Graph , но я предполагаю, что «сплошные» белые линии - сильные утверждения, а чуть более прозрачные (серые) - слабые.Это означает, что есть одна сильная претензия к моему контролеру.Один внизу.

Это нижний ряд: Memory Graph 2

Что это значит?Кажется, у моего (пользовательского) NavigationController есть массив с именем _childViewControllers, в котором хранится мой выдвинутый контроллер.Для пояснения, у меня нет любых хранимых переменных в моем пользовательском NavigationController.Это только подкласс для переопределения 5 функций, вот и все.У меня около 20 различных ViewControllers, которые нажимаются и выталкиваются этим точно таким же пользовательским `NavigationController, но у них всех нет проблем с этим.

Я неправильно читаю график?Должно быть другое сильное утверждение, которое не видно на графике, верно?Когда я «выталкиваю» viewController, нажимая Back, не должен ли мой viewController быть удален _childViewControllers?

1 Ответ

0 голосов
/ 11 апреля 2019

Разобрался наконец. К сожалению, мне приходилось проходить комментирование нескольких сотен строк кода по крупицам, пока я не узнал, когда он начал деиницироваться, когда ожидалось. Проблема заключалась в отсутствии [weak self] в замыкании, что не было неожиданностью, но это было в совершенно другом классе, связанном через сложную иерархию.

...