了解仪器进行内存泄漏检查 - iPhone

Sag*_*ari 6 iphone memory-leaks instruments

替代文字

上面给出的图像是我的应用程序泄漏.

在这里,我想了解一下,在扩展细节中 - 您可以看到不同的颜色,如浅绿色,浅粉色,浅棕色,浅紫色.

每种颜色表示什么?

现在另一个困惑是"如何找到造成内存泄漏的代码?"

高达内存泄漏的限制 - 实际的iPhone可以继续使用.(假设10个字节没问题,20个字节没问题,200个字节有问题)

  • 每种颜色表示什么?
  • 哪种颜色表示我们的代码/从哪个细节我们可以获得我们分配对象的代码并忘记解除它?

(例如 - 详细点击UIKit第二个单元格 - 我们无法获取代码)

  • 为什么我们必须解决所有泄漏? - 即使是一次泄密也可以蚕食iPhone?
  • 为什么iPhone允许泄漏留在内存中?/为什么在终止申请后垃圾收集不会自动完成?
  • 如果我尝试释放应根据仪器解除分配的对象,我的应用程序会异常终止.如果我不dealloc,我的应用程序运行完美,如何?
  • 为什么建议您在视图中等待最多10秒或更长时间,如果有泄漏,仪器会检测到泄漏?

Ken*_*ner 14

忽略颜色,在那个[DashBoard viewDidLoad]是泄漏的来源,它是如何初始化URLConnection(可能你没有释放连接完成后?)

现在回答你的其他问题:

  • 为什么我们必须解决所有泄漏? - 即使是一次泄密也可以蚕食iPhone?

是.部分原因不仅仅是你的内存耗尽,而且因为整个手机只有很多内存可供使用,看门狗应用程序会不断监视你的应用程序,如果看到内存使用,它会提前关闭它只有不断增长......

  • 为什么iPhone允许泄漏留在内存中?/为什么在终止申请后垃圾收集不会自动完成?

当应用程序退出时,将释放所有应用程序内存.

  • 如果我尝试释放应根据仪器解除分配的对象,我的应用程序会异常终止.如果我不dealloc,我的应用程序运行完美,如何?

在这里我无法帮助,你真的需要阅读更多关于保留/释放内存周期...如果你释放一个保留计数为0的对象,应用程序崩溃,因为对象已经消失.

  • 为什么建议您在视图中等待最多10秒或更长时间,如果有泄漏,仪器会检测到泄漏?

因为乐器通常每隔一段时间对内存进行一次采样,所以可能需要一点时间才能让乐器在动作后读取内存.

  • +1优秀答案肯德尔.@sagar,你应该注意到问题3,你应该*永远*直接调用dealloc,只保留或释放(只有例外是[super dealloc]).我相信你的解决方案是实现自动释放,因为听起来你的崩溃是由于早期释放对象造成的.例如[[[NSArray alloc] init] autorelease]; (2认同)

jtb*_*des 5

首先,堆栈中的东西是由它们来自哪个库着色的,因此它不包含那么多信息.

其次,我不会担心iPhone可以承受多少泄漏,而是专注于不泄漏.

要查找泄漏,有几个选项:

  • 在构建项目时使用CLANG静态分析器
  • 手动查找泄漏.你必须始终遵循的内存管理的规则:如果你alloc,retaincopy某个对象(包括使用@property (retain)(copy)),你必须 release或者autorelease它.