iPhone - 应用程序被弹出

时间:2010-02-22 19:45:14

标签: iphone iphone-sdk-3.0 ipad

我有一个应用程序被iPhone OS弹出“低内存”。

我通过仪器通过它,我看到零泄漏,内存使用量约为640 kb。

当我将对象添加到屏幕时,应用程序崩溃。

这是它的工作原理。我有一个基于UIImageView的类非常简单,并为对象添加了一些属性。该类用于创建的对象。

当用户点击按钮时,会创建该类的新图像并将其添加到self.view。

添加了大约15个对象后,应用程序弹出低内存警告。

仪器报告没有显着的内存使用量。即使添加了15个对象,ALL ALLOCATIONS条目也不会超过660 kb。每个对象可以是五个120x120像素图像中的一个。

如果不是对象分配或泄漏,那会是什么?请告诉我应该遵循哪些方向来找到问题。

感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

ObjectAlloc工具未指示应用程序中的所有内存使用情况。视图和其他可视元素在ObjectAlloc中未显示其完整大小,因此您需要使用Memory Monitor工具在任何给定时间查看应用程序的实际内存大小。

另外,仅仅因为仪器没有报告泄漏并不意味着它们不在那里。通过Clang Static Analyzer运行您的应用程序,再次查看潜在的内存泄漏(通过Xcode 3.2或downloading the standalone tool下的Build | Build and Analyze)。再说一次,即使这个过去了,你仍然看到不断增加的内存消耗,你就会在某个地方泄漏。

您提到在评论中使用Quartz绘图。您需要记住Quartz中使用的Core Foundation对象也遵循特定的内存管理模型,其中您使用名称Create的函数创建的所有内容都必须使用匹配的函数CFRelease()来释放。如果忘记了这一点,这可能不会显示为泄漏,但确实如此。

答案 1 :(得分:1)

泄漏不是你的问题。过度保留是。

查看对象分配。如果该图表上升和上升,您的应用程序将被杀死。让你特别生气的是当你被告知释放一些内存(低内存警告)并且没有内存被释放时。您的代码可能只是一个极端情况,但是当您收到此消息时,您应该释放SOMETHING。

答案 2 :(得分:-6)

我发现问题与我的代码无关。每次我在iPhone上使用石英时都会遇到这种问题。

Quartz有一个严重的问题需要修复。据我发现,它会获取大量内存来执行绘图,即使您释放了所有使用的变量和引用,也不会释放它们。即使你把所有变量都设为零。

Quartz是一个记忆食者和崩溃的来源。

这是我创建的一个项目,用于演示Quartz如何使项目崩溃。在MyClass.m中查找一个名为imageWithBorderFromImage的方法。此方法使用quartz在对象周围绘制虚线边框。运行该项目,然后在按钮中单击几次。每次单击时,都会在屏幕上添加一个新对象,位于前一个对象之上。大约20次点击后,应用程序被跳板弹出。在此之前,您将在控制台上看到LOW MEMORY警告。

在告诉我问题创建的视图太多之前,请先禁用quartz方法,然后再看看该应用程序是否崩溃了。事实上,我能够点击80次,仍然可以继续点击,但我停止了应用。

<强> Download the project QuartzNightmare here

相关问题