【问题标题】:Memory management when doing multitasking in iOS 4在 iOS 4 中进行多任务处理时的内存管理
【发布时间】:2010-07-28 03:53:32
【问题描述】:

根据 Apple... 应用程序在“后台”(挂起模式)运行时应尽可能减少内存占用。我通过在 ApplicationDidEnterBackground 中释放一堆 2D 纹理并在 ApplicationWillEnterForeground 中重新加载相同的纹理来减少我的应用程序的内存占用。在大多数情况下,一切都有效。

这是我的问题:当我将应用程序快速移入/移出后台时,为什么会收到 SIGABRT 或 EXEC_BAD_ACCESS?当应用返回前台(正在重新加载纹理)时会发生错误。

当我将应用程序移入/移出后台的速度较慢时,我没有收到任何错误。我怎样才能防止这种情况?也许我应该在尝试重新加载资源之前检查资源是否真的被释放了?

在这种情况下,如何进行防御性编码

【问题讨论】:

  • 听说会进入前台可以调用之前确实进入后台就快速切换了。防御性代码。
  • 我确定您已经知道,但是当您向已发布的对象发送消息时会出现该错误。这个例子很难具体说明。
  • @drawnonward:如果是这样,您可能会考虑先跟踪执行的内容。不一定是最佳编程实践,但应该可行。
  • 一个可以提供帮助的防御性举措:在解除分配后将您的纹理设置为 nil,这样您就不会面临将消息发送到垃圾地址的危险。
  • 尝试使用 NSZombiesEnabled 运行,它至少会告诉您正在向哪个对象发送消息,任何被释放的东西都应该设置为 nil,因为这样如果您向它发送消息,什么都不会发生,而不是您的程序爆炸了。

标签: iphone memory-management ios4


【解决方案1】:

我知道这是一个较老的问题,但让我试一试。您提到发布 2D 纹理。你使用的是 Cocos2D 吗?

今年早些时候我遇到了与您类似的问题 - 问题不在于我的代码。这是 Cocos2D 的问题 - 存在一个错误,即纹理可能在异步加载新纹理的同时被清除。

我已经报告了这个问题,似乎 2 月份对 Cocos2D 项目的提交也解决了类似的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2011-04-08
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    相关资源
    最近更新 更多