【问题标题】:Objects not being released fast enough, causing an app relaunch crash对象释放速度不够快,导致应用重新启动崩溃
【发布时间】:2011-11-21 14:29:47
【问题描述】:

我有一个应用程序,其中有 5 组动画存储在一个数组中。按下按钮后,动画会随机播放。这一切都很好,但是当我退出应用程序并立即重新打开时,我注意到了一个错误,我会看到我的主视图,然后它会跳转到我的第二个视图,其中包含动画。 (这不应该发生,因为您必须点击主视图才能在第二个视图中进行模态交换。如果我与它交互,一切都会工作几秒钟,然后它会关闭而没有崩溃日志。

我终于意识到有些对象释放的速度不够快,因为如果我关闭应用程序并等待三秒钟,然后重新打开,一切都会正常执行。

我不想写下代码来展示,因为这更像是一个头脑风暴问题。我喜欢任何可以为我指明正确方向的见解。我更改了很多代码以摆脱便利方法,并定义了所有变量,然后在我的 dealloc 中释放。

有没有办法真正告诉应用程序在退出时杀死所有内容?它没有设置为在后台运行,所以这有点奇怪。感谢您的帮助,我还是新手!

【问题讨论】:

    标签: iphone objective-c ios release


    【解决方案1】:

    默认所有应用都可以进入后台。通常它们不会在那里做任何事情,但它们会以冻结状态停留在那里,当您再次打开它们时,您的程序不会重新启动,它只会从中断的地方继续。

    任何设置为动画委托的东西都可能不会被释放,因为它会为此目的而保留,直到动画完成。

    您可以将applicationDidEnterBackground: 方法添加到您的应用程序委托中,以便在您的应用程序进入后台时获得通知,但您需要做什么取决于您的应用程序的设计。您还可以添加applicationWillEnterForeground: 以在重新启动时执行您需要执行的任何操作,而不是重新启动。

    您可以通过开始一个持续时间为 0.0 的新动画来强制动画完成(如果由于某种原因您不能这样做,则可以很短)。

    【讨论】:

    • 感谢现场,今晚我将继续工作,让您知道,谢谢!!!
    【解决方案2】:

    如果只有当您的应用程序进入 bkgnd 并返回时才会发生这种情况,并且您不介意应用程序每次返回时都会重新启动,那么只需输入 UIApplicationExitsOnSuspend in your app's plist。在我所有的情况下,当应用程序进入和返回 bkgnd 时会发生这些和其他不好的事情,这有帮助。

    虽然双击时您可能仍会在按钮上看到该应用程序,但它实际上已停止并将重新启动。显示在按钮上的应用程序并不总是必须运行或存储在我学到的 bkgnd 中。

    ps。不要忘记将 UIApplicationExitsOnSuspend 的值设置为 YES

    【讨论】:

    • 感谢您的建议,我下班后会处理这个问题,并告诉您进展如何,谢谢!!
    • 感谢您的帮助,很遗憾没有奏效。我正在使用下面推荐的 applicationDidEnterBackground 方法来看看它是如何进行的。谢谢!
    • 感谢您的更新 - 请随时通知我们 - 因为我很惊讶您的应用在发送到 bkgnd 时并没有像您所说的那样退出。我以前没见过这个。你确定它真的退出了。当你重新启动时,你能以某种方式检查它是否真的重新启动。并不是说设置有问题。您是否将 UIApplicationExitsOnSuspend 的值设置为 YES ?
    • 是的,我将其设置为“是”以在暂停时退出。只是动画似乎在 2-3 秒后发布。然而,我决定在最初构建应用程序时重新编码,现在我对编程设计有了更好的了解。我通过加强我的方法来解决这个问题,更好地跟踪发布/自动发布的内容。感谢您和@morningstar 的帮助!
    • 我用正确的答案更新了这个问题!感谢@user387184 的帮助。
    【解决方案3】:

    好的,在整个周末都在做这件事并进行了更多研究并将我的应用程序的准系统版本与我的预发布版本进行比较之后,我发现内存泄漏是我正在使用的 Flurry Analytics api 造成的。显然我遇到了与这里的帖子相同的问题:App hangs on restart with latest Flurry SDK and ios4。我通过将这些可选方法设置为 false 解决了这个问题,因为它们在应用程序终止后需要额外的时间来发送数据,并且根据连接需要几秒钟。

    FlurryAnalytics.h

    /*
     optional session settings that can be changed after start session
     */
    + (void)setSessionReportsOnCloseEnabled:(BOOL)sendSessionReportsOnClose;    // default is YES
    + (void)setSessionReportsOnPauseEnabled:(BOOL)setSessionReportsOnPauseEnabled;  // default is YES
    

    希望这可以帮助其他经历过与我类似的事情的人!

    【讨论】:

    • 是的,Flurry 将尝试发送关闭/关闭报告,这将延迟应用程序的关闭。基本上,如果您有此功能集(或其他任何延迟关闭的功能),您需要更改应用程序以处理 applicationWillEnterForeground 以彻底重置应用程序,即使您设置了 ExitsOnSuspend。
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多