Я думаю, что ваш взгляд сбрасывается с помощью вещи didReceiveMemoryWarning
, которая запускается ресурсоемкой камерой. Вы можете заставить симулятор генерировать предупреждение памяти без камеры, чтобы проверить эту теорию.
Вообще говоря, viewDidLoad должен иметь возможность иметь дело с вызовом несколько раз. Это не init
метод. Он вызывается снова, если для self.view
установлено значение nil, и представление позже необходимо воссоздать. Может быть более подходящее место для размещения любого имеющегося у вас кода, вызывающего проблемы, но методы init
хитры, потому что указанный инициализатор обойден загрузкой пера.
При загрузке из пера вместо этого вызывается класс initWithCoder
, который обходит весь процесс инициализации, поскольку предполагается, что разархивирование всасывает уже инициализированный объект. Следовательно, повторная инициализация объекта может привести к поломке, например, вызову loadView, который по существу конфликтует с тем, что содержит перо, поскольку предполагается, что оно программно создает то, что перо уже имеет в нем. Вы все еще можете переопределить initWithCoder как обычно, хотя, пока вы проходите через аргументы к super
, как вы должны, но тогда это не будет вызвано, если вы инициализируете объект с помощью назначенного инициализатора. Конечно, если вам нужно беспокоиться об этом, вы можете поместить весь код, который вы хотите выполнить в обоих, в метод, который вызывается из обоих переопределенных методов.