Есть ли сценарий, который может вызвать 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

Это низкий уровень издержек, но достаточно надежный способ убедиться, что ключевой объект существует в широком диапазоне условий прерывания работы приложения / фона, переднего плана и низкого объема памяти.

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

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