Xcode 7/Swift 2.1 "Message from debugger: Terminated due to memory issue"

Xcode 7/Swift 2.1 "Message from debugger: Terminated due to memory issue"

我正在使用 Xcode 7 在 Swift 2.1 中开发纸牌游戏,我的应用 运行 在模拟器中运行良好,但在我的设备上测试时崩溃。

使用断点,我已将崩溃精确定位到一个 NSTimer.scheduledTimerWithTimeInterval 方法,该方法在一个动画发生后 运行 秒(然后触发另一个动画)。

我想这可能是我的图像的大小,因为有些图像非常大 (>4 MB),所以我压缩了动画中的所有图像,现在它们总共占用不到 1 MB。

我也 运行 Zombie 和 Leak 工具,但一无所获,所以我有点困惑。这是崩溃的代码。

func animateOnDeal() {
    self.playerAnimatedCard.hidden = false
    self.dealerAnimatedCard.hidden = true
    cardOneToDeal()
}

func cardOneToDeal() {
    UIView.animateWithDuration(0.5, animations: {
        self.playerAnimatedCard.center.x -= self.view.bounds.width
        }, completion: {finished in self.flipCardOne()})
}

func flipCardOne() {
    self.playerAnimatedCard.playFlipAnimation()
    NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: "cardTwoToDeal", userInfo: nil, repeats: false)
}

这里是实际 运行 动画的代码(在 UIImageView 子类中):

func playFlipAnimation() {
    self.image = UIImage(named: "cardback2.png")
    self.animationImages = nil
    var imgArray = [UIImage]()

    for var x = 1; x <= 12; x++ {
        let img = UIImage(named: "img\(x).png")
        imgArray.append(img!)
    }

    self.animationImages = imgArray
    self.animationDuration = 0.3
    self.animationRepeatCount = 1
    self.startAnimating()

作为旁注,调试器简单地声明:"Message from debugger: Terminated due to memory issue."

如有任何帮助,我们将不胜感激,如果您需要更多信息,请告诉我。谢谢!

编辑:

因此,为了对其进行更多测试,我将 func playFlipAnimation 更改为迭代并添加 5 张图像,而不是原来的 12 张。这似乎解决了崩溃问题,但我仍然不确定为什么要添加更多图像图像首先使应用程序崩溃。

几点:

  1. 正如 Derek Lee 已经指出的那样,图像可能非常占用内存。根据我的经验,运行time 还会在图像使用后在后台缓存一段时间。这可能与您的情况有关,因为查看您的代码,每次调用动画时您都会加载一组新的十二张图像。如果您多次迭代该动画,那么这将很快增加大量内存,尤其是对于 1MB 的图像文件。在这种情况下,虽然它在短 运行 中看起来效率低下,但您可能需要考虑在初始化 class 时初始化图像数组,您可以重复使用它。

  2. 当迭代一个你知道会占用大量内存的循环时,你可以做的一件事是将它放在自动释放池中。请参阅开发人员参考:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html 我知道从技术上讲,ARC 应该是您在现代 iOS 世界中所需要的一切,但当我在我的一个应用程序中构建一个数据密集型过程时,它对我有用。

  3. 您不太可能在模拟器中触发内存警告 运行ning,因为没有考虑到底层硬件比目标设备有更多的可用容量这一事实.以我无限的智慧,我曾经留下一些东西 运行ning,它最终使用了 50GB 的内存,但并没有在模拟器上触发任何类型的警告!

  4. 顺便说一句,我认为您应该能够将卡片图像压缩到远小于 1 MB。当然这将取决于你想使用什么样的图像(它们是照片吗?)但是如果它是一个简单的 .png,那么我觉得它很大。

希望对您有所帮助。

我遇到了同样的问题,发现是我勾选了方案中的Enable Zombie Objects的问题。所以你也可以检查一下。