摆脱Autorelease池

时间:2011-04-13 12:46:44

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

我有一个iPhone应用程序崩溃没有解释。在看到自动释放池不适合iOS之后,我去了我的应用程序中搜索它们并发现了三个(包括一个在main.m中,另一个在NSThread中)。

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

谢谢!


编辑1

我正在打印,但看不出它崩溃的原因。基本上我启动一个调用方法然后应用程序崩溃的线程。该方法设置的第一件事是打印到控制台(没有值,只是为了显示调用工作),但它甚至没有到达那一点。很奇怪。关于如何调试这个的任何想法?

4 个答案:

答案 0 :(得分:5)

你在哪里读到自动释放池是不明智的?我建议你找一些更好的信息来源。

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

当您在应用程序崩溃时,在调试模式下运行时是否可以获得任何内容?控制台中的任何堆栈跟踪,还是记录内存警告的日志消息?应用程序是随机崩溃还是仅在执行特定操作后崩溃?更多信息和/或代码将非常有用。

答案 1 :(得分:3)

属于iOS模板的自动释放不是问题。自动释放池通常是必需的,可能不是您的应用程序崩溃的原因。

解决您的问题

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

答案 2 :(得分:0)

根据Apple文档,需要在main函数和新线程中自动释放。因为当app启动时会保留一些内存用于启动应用程序。如果自动释放池从主函数中恢复,则内存泄漏将由模拟器在创建新线程时显示。

答案 3 :(得分:0)

需要自动释放池,并且自动释放池的存在肯定不是您的问题。如果您的应用程序在没有有用日志的情况下失败,请尝试在例外情况下设置断点。

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