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

gijlo24d  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(253)

我正在Swift 2.1中使用Xcode 7开发一款纸牌游戏,我的应用程序在模拟器中运行良好,但在我的设备上测试时崩溃。
使用断点,我已经将崩溃定位到一个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个。这似乎已经解决了崩溃,但我仍然不确定为什么有更多的图像是崩溃的应用程序摆在首位。

c8ib6hqw

c8ib6hqw1#

有几点:
1.正如Derek Lee已经指出的,图像可能会占用大量内存。根据我的经验,运行时也会在使用图像后将其缓存在后台一段时间。这可能与您的情况有关,因为查看您的代码,每次调用动画时,您都将加载一组新的12个图像。如果你要反复多次的播放动画,那么很快就会增加大量的内存,特别是对于1 MB的图像文件。虽然在短期内看起来效率不高,但您可能希望在初始化类时初始化一个图像数组,这样可以重用。
1.当循环迭代时,如果知道循环会占用大量内存,可以做的一件事就是将其放入autoreleasepool中。请参阅开发人员参考:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html我知道从技术上讲,ARC应该是现代iOS世界所需要的一切,但当我在我的一个应用程序中构建一个非常数据密集的过程时,它对我很有效。
1.在模拟器中运行时,您不太可能触发内存警告,因为没有考虑到底层硬件的可用容量比目标设备大得多。在我无限的智慧中,我曾经让某个东西运行,最终使用了50 GB的内存,但这并没有在模拟器上触发任何类型的警告!
1.顺便说一句,我认为你应该能够将你的卡片图像压缩到远小于1 MB。当然,这将取决于你想使用什么样的图像(它们是照片吗?),但如果它是一个简单的.png,那么对我来说,这似乎相当大。
希望能有所帮助。

bvpmtnay

bvpmtnay2#

我遇到了同样的问题,发现是方案中勾选了启用僵尸对象的问题,所以你也可以勾选

相关问题