是否有任何情况可以导致在 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”方法对之间的区别?

是否有任何代码可以在不裁剪和放大android的情况下设置壁纸?