2015-11-28 3 views
9

Swift 2.1のカードゲームでXcode 7を使用していますが、私のアプリはシミュレータで正常に動作しますが、 。Xcode 7/Swift 2.1 "デバッガからのメッセージ:メモリの問題により終了しました。"

ブレークポイントを使用して、私はNSTimer.scheduledTimerWithTimeIntervalメソッドにクラッシュを突き止めました。このメソッドは、アニメーションが発生した後に実行され、別のアニメーションをトリガします。

かなり大きい(> 4 MB)ものもあるので、私の画像のサイズかもしれないと思ったので、すべての画像を圧縮して合計で1 MB未満になりました。

また、ゾンビとリークのツールを実行して何も見つかりませんでしたので、私はちょっと困惑しています。ここではクラッシュするコードです。

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() 

は、デバッガが単に述べて:「デバッガからのメッセージ:終端によるメモリの問題に"

ご協力いただきまして誠にありがとうございます。詳細情報が必要な場合はお知らせください。ありがとう!

EDIT:

だから、私は反復し、代わりにこれがクラッシュを解決しているようだオリジナルの12の5枚の画像を追加するにfunc playFlipAnimationを変更しましたが、私はまだわからないよいくつかのより多くのそれをテストするために、なぜより多くの画像を持つことが最初の場所でアプリケーションをクラッシュさせているのかについて。

+5

メモリの問題のために終了することは、必ずしもリークの兆候ではありません。まだ行っていない場合は、Allocations Instrumentを使用していくつかのプロファイリングを行い、メモリの増加がどこで発生しているかを正確に確認することをお勧めします。デバイス上でアプリを実行する際には、「リファレンスカウントの記録」にチェックを入れ、永続オブジェクトの数を記録してください。 Allocations楽器に関するオンラインチュートリアルがいくつかありますが、ここで追加のガイダンスが必要な場合はお知らせください。 –

+0

@DerekLee、アドバイスありがとう!だから私はAllocationsを実行し、いくつかのフラグを受け取りました。 "Objective-Cメッセージがアドレス0x7fc5dda8bbf0の無効な 'IDEActivityReport'オブジェクトに送られました。私はこのメッセージを検索しようとしましたが、実質的なものは何も見つかりませんでした。どのようなアイデアを引き起こす可能性がありますか? – rdespoiu

+0

@DerekLeeもう少しテストするために、func playFlipAnimationを変更してオリジナルの12個の代わりに5個の画像を追加しました。これはクラッシュを解決したようですが、なぜ画像を増やすのが不思議ですか?最初にアプリケーションをクラッシュさせます。 – rdespoiu

答えて

1

ポイントのカップルは:デレク・リーはすでに指摘したように

  1. 画像は非常にメモリが集中する可能性が。私の経験では、ランタイムは、使用された後、ある期間、バックグラウンドでキャッシュされたイメージを保持します。あなたのコードを見ると、アニメーションが呼び出されるたびに新鮮な12個のイメージのセットがロードされるので、これはあなたの状況に関係します。そのアニメーションを何度も繰り返していると、すばやく多くのメモリ、特に1MBのイメージファイルが追加されます。この場合、短時間では非効率に見えるかもしれませんが、クラスが初期化されたときにイメージの配列を初期化することを検討してください。再利用することができます。

  2. あなたが知っていることを知っているループを反復するときにできることは、メモリリースプールに置くことです。 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html 技術的には、現代のiOSの世界ではARCが必要なすべてでなければならないことは知っていますが、私のアプリでデータ集約的な手順を構築しているときにはうまくいきました。

  3. Simulatorで実行中のメモリ警告を引き起こす可能性は低いです。基本的なハードウェアがターゲットデバイスよりかなり多くの容量を使用できるという余裕がないためです。私の無限の知恵の中で私は一度50GBのメモリを使用して終了した何かを残しましたが、それはSimulator上で警告を発しませんでした!

  4. 私は、カードイメージを1 MBよりもずっと小さく圧縮できるはずです。もちろん、これはあなたが使用したい画像の種類(写真ですか?)に依存しますが、単純な.pngの場合、それは私にはかなり大きいようです。

希望します。

2

私は同じ問題を抱え、スキームでを有効にしました。ゾンビオブジェクトを有効にしました。だからあなたもそれをチェックするかもしれない。 enter image description here

+0

私は同じことをしている...しかし、SqliteのDBで15枚の画像を保存した後もまだ問題に直面しています。 –

関連する問題