9

我正在使用 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 个。这似乎已经解决了崩溃问题,但我仍然不确定为什么拥有更多图像会使应用程序崩溃首先。

4

2 回答 2

2

我遇到了同样的问题,发现是我在方案中检查了Enable Zombie Objects的问题。所以你也可以检查一下。 在此处输入图像描述

于 2016-12-06T03:39:11.047 回答
2

几点:

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

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

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

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

希望有帮助。

于 2016-09-10T13:24:07.247 回答