2011-10-19 12 views
0

私はこの件に関して、ここでいくつかの記事を見ましたが、確定的な回答はありません。ここに私の問題があります。UINavigationController:ポップ時にViewControllerのメモリを解放します

私はギャラリーとして使用するUINavigationControllerを持っています。最初のコントローラでは、たくさんのリモート画像をロードします。これは私のメモリサイズを増やしますが、それだけではありません。画像をクリックすると、別のviewControllerがプッシュされます。この画像には、クリックしたばかりのギャラリーの画像があります。これにより、それらの画像からさらに1MB以上のデータが読み込まれる可能性があります。

ここでの問題は、ユーザーがこれらのギャラリーをいくつでも参照できることです。私がviewControllerをポップすると、そのメモリは解放されないので、ユーザがギャラリーをブラウズし続けると、私はアプリであまりにも多くのメモリ使用量を取得し始めます。

viewControllerがポップアップしてこのメ​​モリを解放する方法はありますか?おそらく私のviewDidDisappear:メソッドで?もしそうなら、私は何をリリースするのだろうか?そして、もう一度それを作ることができますか?私は、私の見解を解放するなどの点でこれを試しましたが、クラッシュします。

この問題に関する洞察はありますか?

PhotosGalleryiPad *gallery = [[PhotosGalleryiPad alloc] init]; 
gallery.items = self.items; 
gallery.asset = self.currentAsset; 
[self.navigationController pushViewController:gallery animated:YES]; 
[gallery release]; 
+0

正直なところ...メモリは本当にする必要がありますように聞こえますスタックからポップするときに読み込んだビューの "dealloc"をアンロードします。 deallocの写真データをすべて正しく公開していますか?ユーザーが何らかの理由で、「戻る」ボタンをクリックすることなく、エンドレスに一連のビューをナビゲートできるようにしていない限り...ビューナビゲータのビューは、一般的にヘッダーの「戻る」ボタンのクリックを解除する必要があります。そうであれば、別のナビゲーションパラダイムを見たいかもしれません。 – Delete

+0

いいえ、deallocが呼び出され、プロパティが解放されています。彼らはちょうどクリックし、コントローラを押し、通常の "戻る"ボタンをクリックしてルートにポップバックします。 –

答えて

0

あなたはこのようなフォアグラウンドにビューを「ポップ」している場合:

infoScreen = [[[infoScreen alloc] initWithNibName:@"InfoScreen" bundle:nil] autorelease]; 
infoScreen.view.center = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2); 
[self.view sendSubviewToBack:self.view]; 

次にあなたがメモリからの眺めを解放/解放する[infoScreen release]; を行うだろう。
alloc、またはretainを覚えている(他の状況もありますが、手を忘れてしまいます)releaseが必要です。

+0

私はメモリ管理ルールを理解しています。私はここにあなたの提案に従っているとは確信していません。 –

+0

あなたの質問に間違いがあると誤解されているかもしれません。私は、もう使用されていないviewcontrollersからメモリを解放するのに役立つと思っていました。 –

+0

私は、スタックからビューコントローラをポップバックするとメモリに保持されているようです。 –

0

通常、スタックからポップされるビューコントローラのdeallocメソッド内のメモリはすべて解放します。

しかし、イメージについて話していて、[UIImage imageNamed:]をロードした場合、UIKitがそれらをキャッシュしている可能性があります。シミュレータで(ハードウェアメニューから)メモリ警告を偽って、キャッシュされたこれらのイメージをアンロードするかどうかを確認してください。

また、機器でヒープショット解析を行うこともできます。ビューコントローラをロードする前にヒープをマークし、ビューコントローラを閉じた後にもう一度マークを付け、どのオブジェクトが詰まっているかを確認します。

0

正確には、これらのギャラリー画像を保持していますか?

gallery.itemsは、画像を保持する変更可能なコレクション(場合によっては配列)であると考えてください。ユーザーが新しいギャラリーを訪れると、より多くの画像がこのアレイに追加されます。ビューコントローラは、コントローラを表示することから、この配列へのポインタを渡している:あなたはビューコントローラをポップするとき

gallery.items = self.items; 

はそう、あなたはまだ同じ、拡大、配列が残されています。この問題は、ビューコントローラをポップするときに、この配列の新しく追加されたイメージをどのようにカリングするかです。

ポインタを渡すのではなく、shallow copy of the collectionにすることができます。それは可変配列だ場合は、次のように行うことができます:ビューコントローラがポップされたときに

gallery.items = [self.items mutableCopyWithZone:nil]; 

すると、そのitems配列が解放されます。ポップされたビューコントローラによって追加されたオブジェクトは解放されますが、古いオブジェクトは以前のビューコントローラのitems配列に保持されたままです。

(私は推測を取っている。私が間違っている場合は、これらのイメージを保持している場所を説明している場合、それが参考になる。)

+0

いいえ、画像の配列ではありません。これはイメージURLの配列であり、NSStringだけです。私はいくつかの研究をする必要がある、私は使用しているいくつかのサードパーティのコードによって引き起こされるかもしれないと感じている。 –

+0

画像を保持しているビューコントローラのようには聞こえません。 deallocでプロパティを適切に解放している場合、ビューコントローラが何かを保持すると思う唯一の方法は、コピーされていないコレクションを経由することです。画像が作成されたりダウンロードされた場所を見ると、その画像が保持されていることがわかります。 –

+0

ありがとうございます。 –

関連する問題