以上给出的图片是我的应用程序泄漏。
在这里,我想了解一下,在扩展细节中,你可以看到不同的颜色,如浅绿色,浅粉色,浅棕色,浅紫色。
每种颜色表示什么?
现在另一个困惑是“如何找到造成内存泄漏的代码?”
高达内存泄漏的限制 - 实际的iPhone可以继续使用。 (假设10个字节没问题,20个字节没问题,200个字节有问题)
(例如 - 详细点击UIKit第二单元格 - 我们无法获取代码)
答案 0 :(得分:14)
忽略颜色,其中[DashBoard viewDidLoad]是泄漏的来源,它是如何初始化URLConnection的(在连接完成时你可能没有释放它?)
现在回答你的其他问题:
是。部分原因不仅在于你只是内存耗尽,而且因为整个手机只有很多内存可供使用,看门狗应用程序会不断监视你的应用程序,如果看到内存使用,它会提前关闭它只有不断增长...
当应用程序退出时,将释放所有应用程序内存。
在这里我无法帮助,你真的需要阅读更多有关保留/释放内存周期的内容...如果你发布一个保留计数为0的对象,应用程序崩溃,因为对象已经消失。
因为乐器每隔一段时间就会对内存进行一次采样,所以可能需要一点时间才能让乐器在行动后阅读内存。
答案 1 :(得分:5)
首先,堆栈中的东西是由它们来自哪个库着色的,因此它不包含那么多信息。
其次,我并没有担心iPhone可以承受多少泄漏,而是专注于不泄漏。
要查找泄漏,有几个选项:
alloc
,retain
或copy
某个对象(包括使用@property (retain)
或(copy)
),必须 release
或autorelease
。 答案 2 :(得分:3)
颜色代表调用堆栈正在经历的不同库。
泄漏是由代码中进行分配的帧引起的,即使实际分配是在OS库中进行的。仪器正在显示完全泄漏内存的位置。您必须弄清楚代码中的哪一行导致泄漏分配,这将是右侧堆栈中的一个帧。
实际的iPhone没有足够的RAM供您的应用程序使用。对于我的应用程序,我倾向于保守估计大约25MB的RAM。如果代码使用得足够多,任何泄漏,无论多小,都会沉没众所周知的船。
答案 3 :(得分:1)
在堆栈扩展视图中查找您的应用程序名称。内存分配通常最后显示,因此您确切知道哪个库负责内存分配。因此,您应该从代码行向下追溯到结尾。颜色只是更容易跟踪与相同库相关的代码行。相同的库调用将使用相同的颜色着色。
至于追踪泄漏本身。首先通过双击扩展视图中的行来进行应用程序调用,并尝试了解确切泄漏的内容。有时您可以用非泄漏替代品替换泄漏的呼叫。例如,我使用一个调用imageNamed从bundle中检索图像,由于内存不足,应用程序不断崩溃。我只是用google搜索图像命名泄漏,并找到了关于如何在我的应用程序中实现图像现金的非常有用的文章。的确,imageNamed API泄漏。有一些API在iphone SDK中泄漏。
此外,尝试检查您如何使用alloc / retain / release等,无论是释放还是自动释放已分配的内存。
祝你的侦探工作顺利。
答案 4 :(得分:0)
我也有仪器泄漏问题。我今天第一次运行我的应用程序使用泄漏并发现了几个泄漏。泄漏不应泄漏,因为它们无法泄漏,除非一些神奇的代码正在执行并提高了我的对象的保留计数。我了解内存管理指南,知道如何使用自动释放池等。但即使是基于空视图的应用程序也包含泄漏,如果我对它进行一些控制。只需点击2-3次左右。继续尝试。我并不了解信息工具试图提供的信息。这些“泄漏”真的是泄漏,还是只是对仪器应用程序可疑的东西?如果一个没有用户代码的空应用程序,只有几个控件放在一个空视图泄漏内存?