应用程序崩溃说使用弧的内存警告

我正在使用ARC和应用程序崩溃说收到内存警告 。 我用过苹果乐器:

http://tinypic.com/view.php?pic=21kedxt&s=5

看起来我没有任何泄漏,但我找不到错在哪里。 崩溃与内存和适当的弧我不能使用释放和任何sorting。 这是我第一次使用弧来处理内存使用情况。 有没有我可以debugging,因为我处理了近两个月。 我有我的代码在我的git集线器,所以这将是有帮助的,如果你看看它。 你可以在这里find它。

我正在处理这个问题几个星期,并希望结束这一点。 谢谢。

不是所有的“泄漏”都出现在仪器的“泄漏”工具中。 而且,值得注意的是,如果一个视图控制器有一个强大的引用周期,不仅视图控制器不会被释放,而且它的所有成员也不会被释放。 但是看看你的分配,你的记忆永远不会被释放,所以你可能在某个地方有泄漏。 但是,我们很难诊断,因为你的github项目是不完整的。 但是这里有一些想法:

  1. 强烈的参考周期并不总是显示在泄漏工具中。

  2. 在传统的强引用循环的变体中,你的代码使用了一个重复的NSTimer ,它将保持对你的视图控制器的强大的引用,这将导致你的视图控制器永远不会被释放(因为定时器维护自己对视图控制器的强引用) 。 为了解决这个问题,你的视图控制器必须在关联的视图消失时停止计时器:

     - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.timer = [NSTimer scheduledTimerWithTimeInterval: 0.05f target: self selector: @selector(tick) userInfo: nil repeats: YES]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.timer invalidate]; self.timer = nil; } 
  3. 除了如上所述的强大的参考周期之外,另一个可能会导致分配增加的现象与您分享的是视图控制器之间的循环stream。 例如,如果您的应用程序从视图控制器A执行push / modal segue来查看控制器B,则应用程序必须随后popup/解除/展开回查看控制器A.如果您将B / A模式推送到A的新实例,你最终将放弃你的旧的A实例,导致像你的分配图。

这些只是可能导致您的分配graphics的一些事例。 但是,我们很难用有限的信息进行进一步的诊断。

在做其他事情之前,使用Xcode的静态分析器( 命令 + shift + B或者“产品”菜单上的“分析”),并确保在那里得到一个干净的健康法案。 让Xcode帮助您在代码中识别您的编程问题。

一旦解决了静态分析仪识别的任何问题,您就可以进入仪器。 请参阅WWDC 2012video, iOS应用程序性能:内存 。 大约32分钟后,它会显示一个与您的分配图非常类似的分配图,描述这些问题的三个来源(泄漏,遗弃的内存或caching的内存),并向您展示如何使用“分配”工具来确定问题。

你应该沿着这个video,你一定会熟悉分配工具的function(如比较堆快照),以确定什么对象泄漏,或看看扩展的细节和调用树来find创build泄漏对象的源代码。 一旦确定了什么是泄漏,我们可以帮助您解决问题。


顺便说一下,比video中描述的堆积图更容易,我经常会select “分配”中的特定图钉(特别是显然从未释放的图钉)上的点击和拖动。 如果这样做,对象摘要将显示在执行窗口期间已分配且未释放的对象(如果按“实时字节”sorting,则最有用):

对象摘要

这可能是有帮助的,但有时它只是神秘的CFStringCGImage分配。 因此,在代码中分配这些对象的时间有时很有用。 如果你从“统计” – “对象摘要”切换到“调用树”,它现在将显示你的每个方法占用了多less内存(我发现这个屏幕最有用,如果我也检查“Invert Call Tree “和”隐藏系统库“):

呼叫树

如果您在这里双击一个符号名称,它实际上会向您显示有问题的代码:

代码示例

通过这个过程,我可以看到在这个尖峰上分配了什么,现在我可以去确定为什么这个内存永远不会被释放(在这种情况下,我故意使用一个重复的定时器,我从来没有invalidated )。

在更复杂的场景中还有其他一些技巧是非常有用的(我特别喜欢在仪器中出现我的代码信号标志,这样我就可以更准确地将代码中的活动与仪器中发生的事情相关联),但这可能太多了进入这里。 希望这个选项 – 在乐器中点击并拖动将是一个有用的工具,以确定什么是分配和从未发布。

  1. 有些情况下ARC不起作用(我的意思是devise)。 当你使用CoreFoundation或Cocoa级别以下的其他东西时,你需要像以前一样pipe理你的内存。 此外,你可以保留周期(通常是块)。 尝试分析项目(在Xcode中生成)或者使用Instruments运行
  2. 如果你只是使用大量的内存,ARC不起作用。 有可能你的数据集太大,你需要重构在给定的时间使用更less的内存

正如我看了你在github上编码

  1. 有一个文件名iCarousel.m.make确保它与ARC兼容,如果不是,则转到目标/构build阶段/编译源,并将fno-objc-arc标记给iCarousel.m。

  2. 使所有类的viewdidunload方法中的所有对象都为零。

希望它会帮助你。