Xcode 7 / Swift 2.1“来自调试器的消息:由于内存问题而终止”

时间:2015-11-28 04:19:12

标签: ios xcode swift swift2 swift2.1

我正在使用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()

作为旁注,调试器只是声明:“来自调试器的消息:由于内存问题而终止。”

非常感谢任何帮助,如果您需要更多信息,请与我们联系。谢谢!

编辑:

因此,为了更多地测试它,我改变了func playFlipAnimation来迭代并添加5个图像而不是原始的12.这似乎解决了崩溃,但我仍然不确定为什么有更多的图像是首先崩溃应用程序。

2 个答案:

答案 0 :(得分:2)

有几点:

  1. 正如Derek Lee已经指出的那样,图像可能非常耗费内存。根据我的经验,运行时还会将图像在使用后的一段时间内保留在后台中。这可能与您的情况有关,因为查看您的代码,每次调用动画时,您都会加载一组12个图像。如果你经常迭代那个动画那么很快就会增加很多内存,特别是对于1MB的图像文件。在这种情况下,虽然在短期内它似乎效率低下,但您可能需要考虑在初始化类时初始化图像数组,您可以重复使用。

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

  3. 您不太可能触发在Simulator中运行的内存警告,因为不会考虑底层硬件的可用容量比目标设备多得多。在我的无限智慧中,我曾经留下一些运行,最终使用了50GB的内存,但这并未触发模拟器上的任何警告!

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

  5. 希望有所帮助。

答案 1 :(得分:2)

我遇到了同样的问题,发现我在方案中检查了启用Zombie Objects 的问题。所以你也可以检查一下。 enter image description here