2012-02-29 17 views
1

私はiOSアプリで奇妙な問題を抱えています。 しばらくすると私のアプリがメモリ不足になってメモリの警告が表示され、すべてがうまくいくように見えますが、メモリ使用量を確認すると、viewDidUnloadへのすべての呼び出しがメモリを解放していないことに気付きました。私のアプリは、それはメモリの警告で再び行く、すべてがうまくいくようだが、多くのメモリが解放されていないので、メモリに速く警告を出し、その後クラッシュする(ほとんどの場合、 )。このクラッシュはランダムです:アプリのフリーズ、アプリの葉、私のデバッガはアプリの一時停止を言うが、悪いアクセスやsigbort、ゾンビはありません。 私の推測では、メモリ警告は十分なメモリを解放できないということです。iOS:ARC、メモリを解放していない

(私はすべての私のviewDidUnloadをチェックし、のviewDidLoadに割り当てられているすべてのオブジェクトnilを作る)

すべてのヘルプが便利になります!

ありがとうございます。

+0

ノートをその種の問題をデバッグする方法を知っています。 – Vassily

+2

あなたのアプリには循環参照があるかもしれませんが、この説明から実際には分かりません。 ARCは素晴らしいですが、それは魔法ではありません。 –

+0

ここにアイデアがある、私はその感謝を確認します – Vassily

答えて

8

私は問題を解決することができました。

すべてのコントローラに " - (void)dealloc"メソッドを書いて、私が入力する必要があるかどうかを確認します。

いつも私はコントローラーをステップバイステップでコントロールしていますが、私のコントローラーをbeeing deallocから守っているかどうかを確認します。

それは「ASSIGN」にあった(と割り当てではなくunsafe_unretainedにすべきではない)「unsafe_unretained」 デリゲート 非ARCプロジェクトから(遺産ではありませんでしたいくつかのプロパティだったほとんどの時間...)

私は空であっても割り当て解除されていないXIBを持ついくつかの奇妙なコントローラも持っていました。 コピー/貼り付けで新しいステップを段階的に再構築し、まったく同じコードで最終的に新しいコントローラをリリースしました。私のコードがダウンロードされている画像の多くを使用しています。gnneee

は、少なくとも私は...今

6

これ以上のデータなしで特定の答えを出す方法はないと思うので、あなたのアプリで何が起こっているのか推測を止め、実際に何が起こっているのかを知ることをお勧めします。 Instrumentsの下でアプリケーションを実行すると、漏れをチェックすることができますし、アプリケーションのメモリフットプリントの大半を担当するクラスを実際に確認することもできます。

リークしたオブジェクトを識別するためにリーク計測器を使用する方法を知っている必要があります。また、割り当てられたオブジェクトが孤立している(漏れていない)期待どおりのメモリ警告に応答します。

https://developer.apple.com/library/ios/#documentation/developertools/conceptual/InstrumentsUserGuide/AboutTracing/AboutTracing.htmlは、開始するのに適している場合があります。また、多数のチュートリアルも用意されています。 http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorialhttp://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/は私が見た最初の結果の1つです。

+1

+1 "推測を止めて...測定方法を学ぶ" – benzado

+0

私はゾンビがなく、計測器で測定された漏れはないと言っていますか? ""孤立した(漏れていない)あなたのアプリが予期したとおりにメモリ警告に反応しないケースがある」私はどのようにするかわからない... – Vassily

+0

私はARCを使用しているので、raywenderlichとfriday.comの両方のチュートリアルは役に立たない。 – Vassily

0

Vassily、

まず、あなたは余分なメモリを解放していない自分自身している場合、-didReceiveMemory警告があなたには良いもしませんし、あなたが殺されるまで、OSがメモリを要求し続けます。これはあなたの問題のように聞こえる。

第2に、それが問題でない場合は、常駐メモリパーティションのサイズのためにおそらく終了している可能性があります。インストゥルメントでVMの割り当てを確認してください。私は、MALLOC_TINYまたはMALLOC_SMALLの両方に5 MB以上の居住者と汚れたフットプリントがあることを期待しています。小さな割り当ての性質上、これらのVMリージョンは縮小されません。あなたが本当に持っている唯一のオプションは、まず最初に小さなアイテムをたくさん作成しないことです。これは実際には、メモリの使用量を減らすためにコードのアルゴリズムを変更することで対処できるものです。

アンドリュー

+1

- ARCプロジェクトでメモリを解放するにはどうすればよいですか?私は多くのViewControllerを割り当てていましたが、ARCの前にナビゲーションスタックを配置していましたが、ARCをリリースしてこのコントローラをポップアップしないように設定していましたが、ARCではもうこれを行うことはできません。私はもうこのコントローラーは必要ないと知っていますが、次のメモリー警告の前に乗ることはできません。強制的にリリースする方法はありますか?私はあなたの助けを借りて、MALLOC_TINY/SMALLをチェックします。 – Vassily

+0

Vassilyでは、ストレージをnilに設定してARC内のアイテムをリリースします。基本的に、あなたはもはやその項目への参照を保持していないことをコンパイラーに伝えています。 Andrew – adonoho

+0

それは私がやっていることです。 exemple:私はmodalyを提示するviewcontrollerを割り当てます。私はこのコントローラをnilに設定します。これは、モーダルviewcontrollerによって取られたすべてのメモリを解放する必要がありますが、私は私のアプリケーションのプロファイル時にしません。 – Vassily

関連する問題