【问题标题】:iOS CPU Activity Suddenly DiesiOS CPU 活动突然停止
【发布时间】:2016-09-23 18:12:49
【问题描述】:

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

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

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

虽然 Leaks 工具确实帮助了一些人,但它只告诉我该应用程序正在疯狂地泄漏。它只会告诉我,在这四秒的时间间隔内,我获得了“4 次新泄漏”和“17 次新泄漏”之间的信息。不过,它们确实与我打开该视图相对应,一旦我开始评论随机的东西(并遵循分配工具有时有用的指导),我将它们中的大部分追踪到三行额外的代码。 “哦,好吧,反正我也不需要那些观点!”这三行不再存在,Instruments 也不再抱怨。

我在这里唯一的抱怨是我的用户界面仍然表现相同!在第四次演示中,整个应用程序变慢了。在进一步检查 Xcode 的工具后,我发现不仅内存仍在增加(这次只增加到 30 MB,而不是 40 MB),而且 CPU 活动已经下降!


好吧,当然我一开始就应该去那里看看,但我并不完美!


我再次运行该应用程序,发现我呈现的视图控制器越多,整体 CPU 活动就会持续上升。到第三个,它达到了 40-60%。主线程看起来很清晰,大部分活动都分布在其他八个后台线程之间(谁知道所有这些线程在做什么)。

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

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

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

非常感谢!


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

【问题讨论】:

    标签: ios iphone swift memory-leaks cpu


    【解决方案1】:

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

    首先,我会在 viewController 中添加一条打印语句,以查看您的 VC 在弹出时是否被释放。

    deinit {
        print(self.description)
    }
    

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

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

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

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

    【讨论】:

    • 感谢您的建议。我什至没有考虑从deinit 打印!一段时间后,我发现在 NSNotificationCenter 的 userInfo 字典中传递 self 是不好的。还有一些其他随机的地方NSNotificationCenter 也妨碍了我,我把它们移到了 KVO。感谢您的帮助!
    • @SeizeTheDay 很高兴听到 :) 我已经远离 NSNotificationCenter 很长时间了,自从我读到这篇文章后,它绝对成为我最后的手段,我不知道是否仍然如此,但读起来很棒sealedabstract.com/code/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多