用户声称 iOS 个应用导致其他 iOS 个应用关闭?那是一回事吗?

Users claim iOS app causing other iOS app to switch off? Is that a thing?

我有一个 Swift 2.3 应用程序被 20 个人通过 TestFlight 使用。它是另一个流行应用程序的配套应用程序,因此用户经常在两者之间切换。他们使用主应用程序一段时间,然后切换到我的应用程序。

人们抱怨的一个问题是,当他们切换到我的应用程序并返回到主应用程序时,主应用程序必须完全重启,这可能需要几分钟时间。他们声称其他应用程序不会导致主应用程序像这样关闭,并希望我 "fix" 我的应用程序不会强制重启其他应用程序。

我是 iOS 开发的新手,所以这有点令人费解。我的应用程序的某些方面是否会强制其他应用程序终止?电池消耗太多?还有别的吗?有没有一种方法可以测试这个或一个指标来降低这种情况发生的可能性?

内存太大。这是主要原因。您的应用程序可能消耗了太多内存,因此 iOS 必须终止任何其他暂停的应用程序,从而在用户尝试 return 时强制重新启动任何其他应用程序。

使用 Instruments 分析您的应用程序以查找和修复任何内存问题。

这可能是内存泄漏。

在 AppDelegate 中添加:

func applicationDidReceiveMemoryWarning(application: UIApplication) {
    //Print and send to analytics
}

检查这个问题:

然后将其添加到您所有的视图控制器中:

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    //Print and send to analytics
    //Dispose of any resources that can be recreated
}

检查内存报告:

有时候当你做一个动作,比如按下某个按钮,你会看到内存使用率明显上升,几秒钟后就不会下降了。那可能是泄漏。

此外,如果单击 "Profile in Instruments",您将在使用该应用程序时获得有关哪个进程占用了多少内存的详细报告。

根据我的经验,内存泄漏的发生主要是因为闭包:

    //Leaks memory
    ez.runThisAfterDelay(seconds: 2) {
        self.doSomething()
    }

    //Doesn't leak memory
    ez.runThisAfterDelay(seconds: 2) { [weak self] () -> () in
        self?.doSomething()
    }

关于闭包内存泄漏的一些来源:

Shall we always use [unowned self] inside closure in Swift

http://blog.stablekernel.com/how-to-prevent-memory-leaks-in-swift-closures