【问题标题】:Getting rid of Autorelease pools摆脱自动释放池
【发布时间】:2011-08-04 16:50:08
【问题描述】:

我有一个 iPhone 应用程序在没有解释的情况下崩溃。在阅读了对 iOS 不建议使用 Autorelease 池后,我在我的应用程序中搜索它们并发现了三个(包括一个在 main.m 中,一个在 NSThread 中)。

我需要做什么才能从我的代码中消除这些?

谢谢!


编辑 1

我正在打印,但不知道为什么会崩溃。基本上我启动一个调用方法的线程,然后应用程序崩溃。该方法设置做的第一件事是打印到控制台(没有值,只是为了表明调用有效),但它甚至没有达到这一点。很奇怪。关于如何调试它的任何想法?

【问题讨论】:

  • 自动释放池不是您的问题。你真的需要它们。
  • 需要自动释放池。检查并查看您是否正在另一个线程上启动任务。根据您的操作,您很可能需要一个自动释放池。
  • 您是否在您的代码应用程序中找到了它们?谁把它们放进去的?

标签: iphone objective-c cocoa-touch memory memory-management


【解决方案1】:

作为 iOS 模板一部分的自动发布不是问题。自动释放池通常是必要的,并且可能不是您的应用程序崩溃的原因。

解决您的问题

  1. 将 NSLog 语句添加到您的代码中以尝试找出您的应用程序崩溃的位置
  2. 使用 Instruments 检测内存问题和泄漏
  3. 您可能过度释放对象。这是一个很好的Memory Management Guide.

【讨论】:

    【解决方案2】:

    根据苹果文档,主函数和新线程中的自动释放是必需的。因为当应用程序启动时,会保留一些内存用于启动应用程序。如果自动释放池从主函数内存泄漏中移除,模拟器将在创建新线程时显示相同的内容。

    【讨论】:

      【解决方案3】:

      您从哪里了解到不建议使用自动释放池?我建议你找到一些更好的信息来源。

      当然,您不应该随意使用自动释放池,使用不当可能会导致问题,但某些情况需要它们。至少,您在main.m 中找到的那个应该在那里。正如您在NSThread 中找到的一样。假设您的代码正确使用它们,它们不太可能对您的崩溃负责。

      当您的应用程序崩溃时,您在调试模式下运行时会得到什么吗?控制台中的任何堆栈跟踪,或谈论内存警告的日志消息?应用程序是随机崩溃还是仅在执行特定操作后崩溃?更多信息和/或代码会很有用。

      【讨论】:

      • 调试器没有打印任何东西。只是“程序以状态值 1 退出”。见编辑1。:)
      • @Eric Brotto - 听起来你的代码在这一点上相当小。如果是这样,您发布其中的一些代码,让我们更好地了解您正在尝试做什么,以及您是如何尝试做的?
      【解决方案4】:

      需要自动释放池,并且自动释放池的存在当然不是您的问题。如果您的应用在没有有用日志的情况下失败,请尝试在异常上设置断点。

      http://developer.apple.com/library/mac/#documentation/IDEs/Conceptual/Xcode4TransitionGuide/Debugging/Debugging.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 2014-09-02
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多