iOS CPU Activity 猝死

iOS CPU Activity Suddenly Dies

说来话长,请耐心等待...

我有一个视图控制器,当在应用程序会话的整个生命周期中出现超过 3 次时,它将挂起并锁定并冻结我的整个应用程序。甚至 Springboard 也会锁定,直到我的应用程序完全后台运行!在 Xcode 的检查器中,我相当震惊地注意到,每次我呈现该视图时,内存占用量都会跳跃 5-8 MB,并且在关闭后不会再次下降。到第四次调用时,应用程序已经使用了 40 MB 的内存。

我的第一个想法是,“天哪,这是一个记忆韭菜!”第二个想法告诉我跳进 Instruments 并追踪它。

虽然 Leaks 工具确实帮助了一些人,但它只告诉我该应用程序正在疯狂地泄漏。它只会告诉我,在这四秒间隔的某处,我获得了“4 次新泄漏”和“17 次新泄漏”之间的结果。不过,它们确实与我打开该视图相对应,一旦我开始评论 运行dom 内容(并遵循 Allocations 工具有时有用的指导),我将它们中的大部分追踪到三行额外的代码。 "Oh well, I don't need those views anyway!" 那三行不再存在,Instruments 不再抱怨。

我在这里唯一的抱怨是我的 UI 仍然表现得一样!在第四次演示中,整个应用程序变慢了。进一步检查 Xcode 的仪器后,我发现不仅内存还在增加(这次只增加到 30 MB 而不是 40 MB),而且 CPU activity 已经下降!


好的,g运行ted 我应该首先看看那里,但我并不完美!


我再次 运行 应用程序,发现整体 CPU activity 随着我展示该视图控制器的次数不断增加。到第三个时,它达到了 40-60%。主线程看起来很清晰,大部分 activity 分布在其他八个后台线程(谁知道它们都做了什么)。

我第四次打开那个视图时,我本以为一切都会像疯了一样被阻止。它没有。 CPU 刚刚...停止了。 运行 在 50-ish% 左右,当我的手指离开屏幕时,它下降了 1%。所有的线程图都从尖刺的石笋缩小为水坑中的微小波浪。根据饼图,绝大多数处理器都可以随心所欲地工作。它不喜欢我。

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

有谁知道为什么会发生这种情况,这是如何发生的,或者我可以做些什么来避免这种情况发生?我在这里画了一个空白...

非常感谢!


需要注意的是,我通过 运行 我的 iPhone 5s 上的应用程序获得了这些。是的,我确实在模拟器上试过,但我的小 MacBook Air 非常喜欢它,但对解决这个问题毫无帮助,只是告诉我问题发生在 iPhones.

我以前 运行 了解过这个问题,下面是我的一般方法,通常可以让我修复这些类型的内存泄漏。

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

deinit {
    print(self.description)
}

下一步,在 ViewController 没有被释放的情况下,我将首先删除核心部分,自下而上,一次一步地注释掉它们,但留下后台控制隐藏可见的视图控制器。通常你可以隔离内存泄漏,一旦你看到 deInit 在删除一些代码后被调用,你可能已经命中了产生强循环引用的部分。

还有一件事,确保所有委托都声明为弱委托,并在代码中搜索闭包,并检查闭包中是否包含硬引用,尤其是对 self 的引用。

此外,查看这篇文章以了解在将实例传递到闭包时使用 unowned 或 weak 可能会有所帮助。

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