2010-02-22 73 views
3

我有一个应用程序被iPhone OS弹出“内存不足”。iPhone - 正在弹出的应用程序

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

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

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

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

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

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

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

感谢您的任何帮助。

回答

-6

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

石英有一个严重的问题需要解决。据我所知,它会得到大量的内存来执行绘图,即使释放所有使用的变量和引用,也不会释放它们。即使你把所有变量都设为零。

石英是一种记忆食物和崩溃的来源。

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

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

Download the project QuartzNightmare here

+2

你能找出任何特定的电话吗?在什么操作系统版本?我在我的应用程序中没有任何Quartz内存问题。 – 2010-02-23 08:41:48

+3

我非常怀疑这是Quartz绘图系统的一个问题,因为Quartz用于绘制操作系统中几乎所有的视觉元素。我在我的应用程序中使用沉重的Quartz绘图,并且从来没有成为内存泄漏的来源,这不是我的错。正如我在我的回答中解释的那样,您可能因为没有正确释放为创建绘图目的而创建的Core Foundation对象而泄漏内存。这可能不是仪器泄漏。 – 2010-02-23 13:47:42

+0

我已经包含一个项目,您可以在其中看到问题。 – SpaceDog 2010-02-23 16:29:50

1

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

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

+0

正如我在我的问题中所说的,我的应用程序没有泄漏,我的内存使用量低于700 kb,但应用程序崩溃。有罪是石英。这一次我能够用非石英的方法取代该方法,现在的应用如丝般光滑。我的使用石英的应用程序也有同样的问题。嗯,当我收到内存警告时,我没有空闲空间。我的应用程序占用空间很小。 – SpaceDog 2010-02-23 03:58:59

+0

我已经包含了一个项目,您可以在其中看到问题。 – SpaceDog 2010-02-23 16:30:49

6

ObjectAlloc工具不会指示应用程序中的所有内存使用情况。视图和其他视觉元素不会在ObjectAlloc中显示其全部大小,因此您将希望使用Memory Monitor工具在任何给定时间查看应用程序的实际内存大小。

另外,仅仅因为Instruments不报告泄漏并不意味着他们不在那里。通过Clang静态分析器运行你的应用程序,再次寻找潜在的内存泄漏(通过Xcode 3.2下的Build | Build and Analyze或者downloading the standalone tool)。再一次,即使这种情况通过,你仍然看到不断增加的内存消耗,你有一个泄漏的地方。

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

+0

Clang报告ZERO问题。 仪器报告ZERO泄漏。仪器报告低于700 kb的内存分配。我在Quartz中使用的每个变量都有一个CFRelease。 我在告诉你。石英是问题。如果你们想要我可以在课堂上使用一个非常简单的石英功能来准备一个项目,你可以自己看看。当我移除石英功能并且石英方法没有泄漏并且没有错误时,问题消失。我看到问题是混合泄漏(只有Apple可以修复),而不是释放缓存内存。 – SpaceDog 2010-02-23 15:24:03

+0

当您说“仪器报告内存分配低于700 kb”是在ObjectAlloc或Memory Monitor仪器中?正如我所说的,ObjectAlloc不会显示应用程序和Memory Monitor的真实大小。如果我没有记错,即使非常简单的应用程序也倾向于使用1.5-2 MB的内存。 – 2010-02-23 16:28:18

+0

我已经包含了一个可以看到问题的项目。 – SpaceDog 2010-02-23 16:31:14