Есть ли сценарий, который может вызвать ViewDidLoad, прежде чем didBecomeActive?
Я знаю, это звучит глупо, но просто чтобы прояснить ситуацию. Есть ли вероятность того, что представление "load" будет вызвано до выполнения didBecomeActive? Это абсолютно невозможно?
РЕДАКТИРОВАТЬ
У нас происходит сбой, который происходит, когда пользователь возвращается в приложение из фона, и мы начинаем использовать openGL. Ошибка указывает на то, что мы пытаемся использовать openGL в фоновом режиме.
Важно сказать, что наше приложение живет в фоновом режиме как приложение VOIP.
Мы пытаемся выяснить, есть ли вероятность того, что каким-то образом мы запускаем что-то в фоновом режиме, что вызывает перезапуск приложения openGl в фоновом режиме.
В стеке мы видим:
[VideoCallViewController viewDidLoad] (VideoCallViewController.m:283)
И несколько строк после этого:
[GPUImageContext createContext]
И наконец:
gpus_ReturnNotPermittedKillClient + 10
Мы пытаемся выяснить, есть ли способ [VideoCallViewController viewDidLoad]
был вызван в фоновом режиме или что мы должны предположить, что мы находимся на переднем плане, и как-то движемся к фону сразу после viewDidLoad
?
Второй вариант Второй вариант заключается в том, что мы действительно переходим к фону сразу после viewDidLoad
, Дело в том, что мы слушаем AppWillResignActive и приостанавливаем GPUIMage. Поэтому мы не можем понять, почему мы получаем крах?
Спасибо
Спасибо
1 ответ
Когда и где вы создаете экземпляры различных объектов GPUImage, которые вы используете? Это внутри viewDidLoad или, возможно, внутри init:?
Это просто безудержная спекуляция, потому что вы действительно не публиковали код...
но если вы избавляетесь от объектов, когда приложение переходит в фоновый режим, которые затем не воссоздаются, когда он возвращается на передний план (возможно, потому что viewController был сохранен родителем, и, следовательно, init: больше не вызывался, но viewDidLoad был...) Тогда вы можете пытаться отправлять сообщения OpenGL объектам, которые на самом деле больше не существуют.
С вероятностью (вероятно, маловероятной), что мои предположения верны, вы можете легко исправить это с помощью общей схемы "getter":
- (GPUImageObjectOfInterest*)instanceOfObject {
if (!_classVariableOfThisType) {
_classVariableOfThisType = [[GPUImageObjectOfInterest alloc] init];
// custom configuration, etc...
}
return _classVariableOfThisType;
}
а затем использовать [self instanceOfObject];
везде, где вы использовали _classVariableOfThisType
Это низкий уровень издержек, но достаточно надежный способ убедиться, что ключевой объект существует в широком диапазоне условий прерывания работы приложения / фона, переднего плана и низкого объема памяти.
Не стесняйтесь публиковать слишком много кода, мы можем при необходимости прочитать весь класс. Некоторым из нас нравится читать код! (и это действительно поможет качеству ответа вы получите...)