如何解决内存崩溃问题

时间:2011-09-30 12:53:21

标签: ios iphone memory crash

我正在创建一个具有多个动画功能的应用程序。 有50页,每页有不同的动画,每个动画使用很多图像。

我正在使用UIPresentModelViewController来呈现视图和 我正在使用NSTimer更改图片。

当我连续滑动时,应用程序崩溃并显示以下消息: -

Program received signal:  “0”.
Data Formatters temporarily unavailable, will re-try after a 'continue'. 

(Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")

我经常搜索,但找不到任何适当的解决方案。

8 个答案:

答案 0 :(得分:0)

只需在代码中检查您每次添加新视图时都会犯错误但忘记发布它...

答案 1 :(得分:0)

崩溃时,您需要查看(并可能发布)堆栈跟踪。以及改变图像的代码。这听起来像内存膨胀(不是真正的泄漏,因为有人仍在指内存)。 Analyze菜单项可能会捕获一些内容(您应该运行它),但您可能需要运行Allocation仪器并查看堆检查。有关详情,请参阅http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

答案 2 :(得分:0)

这听起来像堆栈溢出给我。在项目的C / C ++语言设置的“Other C Flags”部分中,为“-fstack-check”添加一个标志,看看是否会出现任何不需要的递归。

答案 3 :(得分:0)

信号0通常是由于内存太低,因为应用程序使用了太多内存。检查是否调用了内存警告方法。

数据格式化程序无法加载可能是由于没有足够的内存来加载它..

答案 4 :(得分:0)

像你这样的50个视图描述听起来像一个大记忆猪。所以我怀疑内存管理正在卸载一些视图。然后,当您的程序需要视图时,它们不在那里,您的程序崩溃。错误消息不太合适,但可能无法准确地告诉您问题所在。

考虑以下可能的情况,看看它是否适合您编写此程序的方式。

为了让操作系统管理内存,它可以根据需要卸载视图并重新加载。完成此操作后,将调用viewDidUnload,loadView和viewDidLoad方法。

viewDidUnload:

  

此方法称为viewDidLoad方法的对应方法。在低内存条件下调用它时,视图控制器需要释放其视图以及与该视图关联的任何对象以释放内存。由于视图控制器通常存储对视图和其他视图相关对象的引用,因此您应该使用此方法放弃这些对象的所有权,以便可以回收它们的内存。您应该只为稍后可以在viewDidLoad方法中或从应用程序的其他部分轻松重新创建的对象执行此操作。您不应使用此方法来释放用户数据或任何其他无法轻松重新创建的信息。

的loadView:

  

视图控制器在请求view属性但当前为nil时调用此方法。如果手动创建视图,则必须覆盖此方法并使用它来创建视图。如果使用Interface Builder创建视图并初始化视图控制器 - 也就是说,使用initWithNibName:bundle:方法初始化视图,直接设置nibName和nibBundle属性,或者在Interface Builder中创建视图和视图控制器 - 那么你不能覆盖这个方法。

检查UIView类参考 -

viewDidLoad中:

  

在视图控制器将其关联的视图加载到内存后调用此方法。无论视图是存储在nib文件中还是以编程方式在loadView方法中创建,都会调用此方法。此方法最常用于对从nib文件加载的视图执行其他初始化步骤。

您可能无意中在init方法中而不是在loadView方法中初始化了这些视图。如果您这样做,那么当操作系统卸载视图(您将看到调用viewDidUnload)时,将卸载与视图关联的内存和所有子视图(所有图像和动画)。这样可以节省内存,但是当您需要重新显示其中一个卸载的视图时,如果先前已卸载视图,则将首先调用loadView。如果您的视图设置是在init方法而不是在loadView中完成的,那么视图将不会再次设置。但是如果视图设置是在loadView方法中完成的,则可以在内存管理卸载后恢复它。

答案 5 :(得分:0)

有一种简单的方法可以找出泄漏仪器等难以找到的泄漏 - 僵尸分析仪。它显示程序中每个未链接的内存,您可以在几分钟内轻松检测泄漏并优化代码。

答案 6 :(得分:0)

如果您为一个动画使用了大量图像,那么您做错了。您应该有一个或几个非常大的图像,然后只显示该图像的一部分。这样,您可以加载非常少的图像,但具有许多图像的相同效果。

查看cocos2d或其他受制于游戏的框架,因为它们对动画的效率要比UIKit高得多。

答案 7 :(得分:0)

使用仪器工具找出内存崩溃的原因,然后使用推荐的设计模式的最佳实践重构代码。对此没有独特的解决方案。感谢。