iOS CPU活动突然死亡

时间:2016-05-25 23:03:32

标签: ios iphone swift memory-leaks cpu

这里有长篇故事,请耐心等待......

我有一个视图控制器,当在应用程序会话的整个生命周期中呈现三次以上时,它将挂起并锁定并冻结我的整个应用程序。即使是Springboard锁定,直到我的应用程序完全背景!在Xcode的检查员中,我注意到相当惊人的是每次我提出该视图时内存占用量都会增加5-8 MB,并且在解雇后它不会再次下降。到第四次调用时,应用程序已经使用了40 MB的内存。

我的第一个想法是,“ OMG,它是一个记忆韭菜!”第二个告诉我跳进仪器并追踪它。

虽然Leaks工具确实帮助了一些,但它只告诉我应用程序像疯了一样泄漏。所有它告诉我的是,在这四秒间隔的某个地方,我在“4次新泄漏”和“17次新泄漏”之间取得了进展。但是,它确实对应于我对该视图的开放,并且一旦我开始评论随机内容(并且遵循分配工具的有时有用的指导),我将其中的大多数跟踪到三行额外的代码。 “哦,好吧,我还是不需要那些观点!”这三条线不再存在,仪器不再抱怨。

我唯一的抱怨是我的用户界面仍然表现相同!在第四个演示文稿中,整个应用程序放慢速度。在进一步检查Xcode的仪器后,我发现不仅内存仍在上升(这次只有30个而不是40 MB),但CPU活动已经消退了!

好的,我认为应该首先看一下,但我并不完美!

我再次运行应用程序,发现整体CPU活动持续增加,因为我提供的视图控制器越多。到第三个时,它高达40-60%。主线程看起来非常清楚,大部分活动都是在其他八个后台线程之间传播的(谁知道所有这些都在做什么)。

Hey look, it's running hot!

我第四次打开这个视图时,我曾期望一切都像疯了一样阻挡。它没有。 CPU刚停了下来。当我的手指离开屏幕时,当它下降到1%时,它的运行速度大约为50-ish%。所有的线图都从尖刺的石笋缩小到水坑中的微小波浪。根据饼图,绝大多数处理器都可以随意使用。它不喜欢我。

Where did it all go??

我完全不知道为什么会这样做。我已经被困在一个房间里好几天了,试图解决这个问题。任何帮助或建议将不胜感激。

有没有人知道为什么会发生这种情况,如何发生这种情况,或者我能做些什么来使这种情况不发生?我在这里画一个空白......

非常感谢你!

应该注意的是,我通过在iPhone 5s上运行应用程序来获得这些。是的,我确实尝试过模拟器,但是我的小MacBook Air把它当作一个冠军,除了告诉我问题发生在iPhone上之外没有帮助解决这个问题。

1 个答案:

答案 0 :(得分:1)

我之前遇到过这种情况,以下是我的一般方法,通常允许我修复这些类型的内存泄漏。

首先,我将一个print语句放入viewController中,看看你的VC在弹出时是否被释放。

deinit {
    print(self.description)
}

下一步,在ViewController没有被解除分配的情况下,我首先要删除核心部分,自下而上,一次一步地将它们注释掉,然后保留隐藏视图控制器的后退控件。通常,一旦在删除某些代码后看到deInit get被调用,就可以隔离内存泄漏,您可能已经触及了一个强循环引用的部分。

还有一件事,确保所有代理都被声明为弱,并在代码中搜索闭包,并检查闭包内部是否包含硬引用,特别是对于self。

另外,查看本文以了解在将实例传递给闭包时使用无主或弱的内容可能会有所帮助。

http://krakendev.io/blog/weak-and-unowned-references-in-swift