Xcode 7 / Swift 2.1 "Сообщение от отладчика: завершено из-за проблемы с памятью"

Я работаю над карточной игрой в Swift 2.1, используя Xcode 7, и мое приложение отлично работает в симуляторе, но падает, когда я тестирую его на своем устройстве.

Используя точки останова, я определил крах метода NSTimer.scheduledTimerWithTimeInterval который запускается после анимации (а затем запускает другую анимацию).

Я думал, что это были размеры моих изображений, поскольку некоторые из них были довольно большими (> 4 МБ), поэтому я сжал все изображения в анимации, и в итоге они теперь занимают менее 1 МБ.

Я также запускаю инструменты 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. Это, похоже, решило проблему, но я все еще не уверен, почему больше изображений сбивает приложение в первую очередь.

Несколько баллов:

  1. Как отметил Дерек Ли, изображения могут быть очень интенсивными в памяти. По моему опыту, время выполнения также будет сохранять изображения в кэше в фоновом режиме в течение периода после их использования. Это может быть уместным для вашей ситуации, поскольку, глядя на ваш код, вы загружаете новый набор из двенадцати изображений каждый раз, когда вызывается анимация. Если вы повторяете эту анимацию много раз, это быстро добавит много памяти, особенно с файлами изображений размером 1 МБ. В этом случае, хотя это может показаться неэффективным в краткосрочной перспективе, вам может потребоваться инициализировать массив изображений, когда инициализируется класс, который вы можете повторно использовать.

  2. Одна вещь, которую вы можете сделать, когда итерация по циклу, который, как вы знаете, будет интенсивным в памяти, – это разместить его в autoreleasepool. См. Ссылку разработчика по адресу: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html Я знаю, что технически ARC должен быть всем, что вам нужно в современном мире iOS, но это работал для меня, когда я строю очень интенсивную обработку данных в одном из моих приложений.

  3. Вы вряд ли когда-либо инициируете предупреждение о сохранении памяти в Simulator, так как не учитывается тот факт, что базовое оборудование обладает значительно большей емкостью, доступной для него, чем целевое устройство. В моей бесконечной мудрости я однажды оставил что-то бегущее, которое закончилось тем, что использовало 50 ГБ памяти, но это не вызывало никаких предупреждений на Симуляторе!

  4. В стороне, я бы подумал, что вы сможете сжать свои карточные изображения до менее 1 МБ. Конечно, это будет зависеть от того, какой образ вы хотите использовать (это фотографии?), Но если это простой .png, то это кажется довольно большим для меня.

Надеюсь, это поможет.

Я встретил ту же проблему и обнаружил, что проблема в том, что я проверил объекты Enable Zombie в схеме. Таким образом, вы также можете проверить это. введите описание изображения здесь

Interesting Posts
Давайте будем гением компьютера.