我知道这听起来很愚蠢但只是为了澄清一点。 在didBecomeActive之前是否有可能调用视图加载? 这完全不可能吗?
修改
当用户从后台返回应用程序并开始使用openGL时,我们发生了崩溃。崩溃错误指出我们尝试在后台使用openGL。
重要的是要说我们的应用程序作为VOIP应用程序存在于后台。
我们试图弄清楚是否有可能在某种程度上我们在后台触发某些因素导致应用程序在后台重启openGl。
在堆栈中我们看到:
[VideoCallViewController viewDidLoad] (VideoCallViewController.m:283)
之后几行:
[GPUImageContext createContext]
最后:
gpus_ReturnNotPermittedKillClient + 10
我们正试图弄清楚是否有一种方式在后台调用[VideoCallViewController viewDidLoad]
,或者我们必须假设我们在前台,并以某种方式移动到后台在viewDidLoad
之后?
第二个选项
第二个选择是我们确实在viewDidLoad
之后立即转向背景。这里的重点是我们正在收听AppWillResignActive并暂停GPUIMage。所以我们无法理解为什么会发生崩溃?
由于
由于
答案 0 :(得分:0)
何时/何地实例化您正在使用的各种GPUImage对象?它是在viewDidLoad中还是可能在init:?
中这只是纯粹的猖獗猜测,因为你没有真正发布任何代码......
但是如果您在应用程序前往后台时处理对象,那么当它返回到前台时就不会重新创建(可能是因为viewController是由父级保留的,因此init:没有再次调用但是viewDidLoad是......)然后你可能会尝试将OpenGL消息发送到实际不存在的对象。
关于我的推测是正确的(可能不太可能)的机会,你可以用以下常见的“getter”模式轻松修复它:
- (GPUImageObjectOfInterest*)instanceOfObject {
if (!_classVariableOfThisType) {
_classVariableOfThisType = [[GPUImageObjectOfInterest alloc] init];
// custom configuration, etc...
}
return _classVariableOfThisType;
}
然后在以前使用 [self instanceOfObject];
的地方使用_classVariableOfThisType
这是一个低开销,但相当简单的方法,以确保在广泛的应用程序中断/背景下存在关键对象&前景&低记忆条件。
不要害怕发布过多代码,如果需要,我们可以阅读整个课程。我们中的一些人喜欢阅读代码! (这将真正有助于你得到的回应质量......)