3

我有一个应用程序因“内存不足”而被 iPhone OS 弹出。

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

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

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

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

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

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

如果不是对象分配或泄漏,那会是什么?请告诉我应该遵循哪些指示来定位问题。

谢谢你的帮助。

4

3 回答 3

6

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

此外,仅仅因为 Instruments 不报告泄漏并不意味着它们不存在。通过 Clang 静态分析器运行您的应用程序以再次查看潜在的内存泄漏(通过 Xcode 3.2 下的 Build | Build and Analyze 或下载独立工具)。同样,即使这通过了,您仍然会看到内存消耗不断增加,您在某处存在泄漏。

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

于 2010-02-23T13:44:05.690 回答
1

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

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

于 2010-02-23T02:01:35.717 回答
-6

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

Quartz 有一个严重的问题需要解决。据我检测,它会获取大量内存来执行绘图并且即使您释放您使用的所有变量和引用也不会释放它们。即使你把所有变量都归零。

Quartz 是内存消耗者和崩溃的来源。

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

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

在此处下载项目 QuartzNightmare

于 2010-02-22T23:16:04.963 回答