是否有任何情况可以导致在 didBecomeActive 之前调用 ViewDidLoad?
Posted
技术标签:
【中文标题】是否有任何情况可以导致在 didBecomeActive 之前调用 ViewDidLoad?【英文标题】:Is there any scenario that can cause ViewDidLoad to be called before didBecomeActive? 【发布时间】:2013-11-01 14:33:59 【问题描述】:我知道这听起来很愚蠢,但只是为了澄清一点。 是否有可能在 didBecomeActive 之前调用视图确实加载? 完全不可能吗?
编辑
当用户从后台返回应用程序并开始使用 openGL 时,我们会发生崩溃。我们尝试在后台使用openGL的崩溃错误点。
重要的是,我们的应用作为 VOIP 应用存在于后台。
我们试图弄清楚我们是否有可能以某种方式在后台触发某些东西,从而导致应用在后台重新启动 openGl。
在我们看到的堆栈中:
[VideoCallViewController viewDidLoad] (VideoCallViewController.m:283)
然后几行:
[GPUImageContext createContext]
最后:
gpus_ReturnNotPermittedKillClient + 10
我们正在尝试确定是否有一种方法可以在后台调用[VideoCallViewController viewDidLoad]
,或者我们必须假设我们在前台,然后以某种方式移动到后台viewDidLoad
?
第二个选项
第二个选项是我们确实在viewDidLoad
之后移动到后台。这里的重点是我们正在监听 AppWillResignActive 并且我们暂停了 GPUIMage。所以我们无法理解为什么会崩溃?
谢谢
谢谢
【问题讨论】:
我不确定,但如果你调用 [yourViewController view] 我想你可能会陷入这种情况...... 【参考方案1】:您何时/在哪里实例化您正在使用的各种 GPUImage 对象?它是在 viewDidLoad 内还是可能在 init: 内?
这只是纯粹的疯狂猜测,因为你并没有真正发布任何代码......
但是,如果您在应用程序返回后台时处理对象,则当它返回前台时不会重新创建(可能是因为 viewController 被父级保留,因此 init: 没有被再次调用但是 viewDidLoad 是...)那么您可能会尝试将 OpenGL 消息发送到实际上不再存在的对象。
如果我的推测是正确的(可能不太可能),您可以使用以下常见的“getter”模式轻松修复它:
- (GPUImageObjectOfInterest*)instanceOfObject
if (!_classVariableOfThisType)
_classVariableOfThisType = [[GPUImageObjectOfInterest alloc] init];
// custom configuration, etc...
return _classVariableOfThisType;
然后在你曾经使用 _classVariableOfThisType 的地方使用 [self instanceOfObject];
这是一种确保关键对象存在于各种应用中断/后台和前台以及低内存条件下的低开销但相当简单的方法。
不过,不要羞于发布太多代码,如果需要,我们可以通读整个课程。我们中的一些人喜欢阅读代码! (它真的会帮助您获得响应的质量......)
【讨论】:
以上是关于是否有任何情况可以导致在 didBecomeActive 之前调用 ViewDidLoad?的主要内容,如果未能解决你的问题,请参考以下文章
Spritekit - 在 didBecomeActive 时保持游戏暂停
SpriteKit - didBecomeActive 时不显示暂停屏幕
在应用程序DidBecomeActive 之后立即调用iOS 应用程序DidEnterBackground 时?
应用程序中的调用函数didbecomeactive - Swift 2.0
UISceneDelegate 和 UIApplicationDelegate 的“didBecomeActive”和“willResignActive”方法对之间的区别?