我正在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个。这似乎已经解决了崩溃,但我仍然不确定为什么有更多的图像是崩溃的应用程序摆在首位。
2条答案
按热度按时间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,那么对我来说,这似乎相当大。
希望能有所帮助。
bvpmtnay2#
我遇到了同样的问题,发现是方案中勾选了启用僵尸对象的问题,所以你也可以勾选