我正在使用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.这似乎解决了崩溃,但我仍然不确定为什么有更多的图像是首先崩溃应用程序。
答案 0 :(得分:2)
有几点:
正如Derek Lee已经指出的那样,图像可能非常耗费内存。根据我的经验,运行时还会将图像在使用后的一段时间内保留在后台中。这可能与您的情况有关,因为查看您的代码,每次调用动画时,您都会加载一组12个图像。如果你经常迭代那个动画那么很快就会增加很多内存,特别是对于1MB的图像文件。在这种情况下,虽然在短期内它似乎效率低下,但您可能需要考虑在初始化类时初始化图像数组,您可以重复使用。
在迭代一个你知道会占用大量内存的循环时,你可以做的一件事就是把它放在autoreleasepool中。请参阅开发人员参考:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html 我知道技术上ARC应该是现代iOS世界中所需要的,但是当我在我的一个应用程序中构建一个数据密集程序时,这对我有用。
您不太可能触发在Simulator中运行的内存警告,因为不会考虑底层硬件的可用容量比目标设备多得多。在我的无限智慧中,我曾经留下一些运行,最终使用了50GB的内存,但这并未触发模拟器上的任何警告!
顺便说一句,我认为您应该可以将卡片图像压缩到远低于1 MB。当然这取决于你想要使用什么样的图像(它们是照片吗?)但如果它是一个简单的.png,那对我来说似乎很大。
希望有所帮助。
答案 1 :(得分:2)