Когда ViewControllers вызывает deinit? Во время перехода на фон? Во время переезда приостановлено?

Я знаю что ViewController будет иметь deinit метод вызывается, когда он больше не нужен (например, после расслабления и последующего увольнения).

Но мне было интересно, каково поведение deinit был в контексте жизненного цикла приложения.

Мои вопросы

1) Когда (какое состояние приложения активно / неактивно / фон / и т. Д.), Если вообще deinit вызывать, если приложение завершается системой из-за ограничений памяти

2) Когда (какое состояние приложения активно / неактивно / фон / и т. Д.), Если вообще deinit вызывать, если приложение закрывается пользователем через экран недавно использованного приложения

3) Когда (какое состояние приложения активно / неактивно / фон / и т. Д.), Если вообще deinit вызывать, если приложение переходит в фоновый режим пользователем, принимающим входящий вызов

4) Когда (какое состояние приложения активно / неактивно / фон / и т. Д.), Если вообще deinit вызывать, если приложение перемещается в фоновый режим пользователем, открывающим другое приложение

2 ответа

Решение

Когда приложение внезапно завершается (ваши случаи 1 или 2), обычно не вызывается код, включая любой код deinit. Нет необходимости в deinit, поскольку вся память приложения освобождается сразу.

Иначе, deinit вызывается, когда объект больше не нужен, и это не имеет никакого отношения к внешним событиям, будь то приложение на переднем плане или в фоновом режиме. Это зависит только от того, когда вы, как программист, освобождаете владельца объекта (например, когда вы открываете контроллер навигации или отклоняете представленный контроллер).

deinit - это базовый метод классов Swift, не являющийся частью UIKit, поэтому он не имеет прямого отношения к жизненному циклу представления, а именно:

View Controller Lifecycle(Из документации Apple)

Деинициализатор вызывается непосредственно перед освобождением экземпляра класса.

(Из языка программирования Swift)

Поэтому, как правило, во всех ваших примерах deinit вызываться не будет (если только вы не удалите все сильные ссылки на ViewController ни в одном из этих случаев, и даже тогда, только если ARC догонит его до того, как выполнение прекратится).

Также обратите внимание, что ваш другой пример размотки не приведет к вызову deinit, если у вас все еще есть сильная ссылка на ViewController (обычно непреднамеренно вызванная циклом ссылок).

Другие вопросы по тегам