3

私は、カスタム内に数百のオブジェクトを表示するアプリ(iOS 5ではARC!)を作成していますUIViewController私は、これは、ユーザが触れることができるサムネイル画像として提示される。ModalViewControllerのiOS - ARC /メモリ管理の問題

これらのオブジェクトのそれぞれには、そのオブジェクトに関連付けられた情報のカスタム表示を処理する特別なUIViewControllerサブクラスが関連付けられています。たとえば、ズームやパンが可能な画像、またはフォーマットが必要なテキストなどがあります。

ここで、私の画像オブジェクトにはそれぞれ大きな画像が関連付けられています。 Instrumentsアプリケーションを使用してコードをプロファイリングし、Activity Monitorを実行すると、カスタムUIViewControllerサブクラスがロードされ、イメージが表示されたときに、これらがそれぞれ約5-10MBを占めることがわかります。これはいくつかの画像では問題ありませんが、最終的に私のアプリはあまりにも多くのメモリを消費し、クラッシュします。

私はサブクラスの-viewDidUnloadメソッドに、このメモリを解放するようにARCに指示するために必要なすべてのものを書いていますが、警告が発行されるまでメモリは解放されません。何度か、閾値に十分に近づいてもそれを超えないと、UIViewControllerのサブクラスは、最終的にメモリからフラッシュされますが、-viewDidUnloadメソッドは明らかに呼び出されませんむしろ-didReceiveMemoryWarningメッセージが私のカスタムUIViewControllersに送信されます)。しかし、ほとんどの場合、私のアプリはメモリが不足するとクラッシュします。

私の中核的な質問は、オブジェクトができるだけ早くARCによって処分されると仮定しなければならないか、それとも常に空間が狭くなるまで待つかということです。私が望む動作は、メモリが問題にならないように、カスタムビューコントローラとそのデータをすぐにフラッシュすることです。

私は私のカスタムView Controllerへのオブジェクトから任意の強い参照があるとは思わない、と私はこのコードを使用して私の主なビューコントローラでそれらのインスタンスを作成:

cObjは、オブジェクトの持つカスタムクラスです
[self presentViewController:[cObj grabModalViewController] 
        animated:YES completion:nil]; 

情報。 grabModalViewControllerは、正しい型のオブジェクトをインスタンス化してポインタを返すだけなので、メソッドが完了するとすぐに、オブジェクトへのローカル参照が破棄されるはずです。

その結果、私は後で

[self dismissModalViewControllerAnimated:YES]; 

を呼び出したときにのみpresentedViewControllerを経由して、プライマリビューコントローラであることを指摘されたカスタムビューコントローラは、メモリからフラッシュされなければならないが、これはない、という期待起こる。

私はカスタムビューコントローラオブジェクト内に強い参照を持っている可能性がありますか?

私が達成しようとしているのは、できるだけ多くのメモリ警告をできるだけ避けることです。正面を管理することで可能ですが、これは正しい姿勢ではありません。

ご意見をお寄せいただきありがとうございます。また、役立つコードを投稿していただければ幸いです。

+0

私は実際には私が何かばかげたと言ったことを実感しました。明らかに、カスタムビューコントローラのメモリがすべて再利用されている場合、このオブジェクトを指す強い参照があってはなりません。しかし、私は、メモリ管理システムがなぜ信頼できないのか理解できません。なぜなら、ときどき私のアプリがクラッシュすることがあり、それができることを知っているメモリを解放するだけではないということです。私はこれが間違った何かを示唆していると思います。 – ddodev

+0

[cObj grabModalViewController]が保持されているオブジェクトを返すかどうかを確認します。または、モーダル・ビュー・コントローラーが別のオブジェクトのインスタンス変数への参照を保持しているサイクルを保持している可能性があります。いずれの場合も、モーダルビューコントローラの割り当てが解除されることはありません。 – timthetoolman

+0

@timthetoolmanは提案に感謝します - 私はかなり確信していますが、どちらもそうではありません。 '[cObj grabModalViewController]'のメソッド本体は次のようになります: 'LightboxViewController * newController = [[LightboxImageViewController alloc] init]; [(LightboxImageViewController *)newController setImageFilename:self.imageFile]; return newController; '新しいLightboxImageViewControllerにはimageFileプロパティがあり、これは' nonatomic、copy'です。私は 'retain 'を持つと問題を引き起こすと思ったが、これは' copy'を使って解決すると仮定した。 – ddodev

答えて

5

だから私のコアの質問は、私は、オブジェクトが できるだけ早くARCにより処分されるか、または スペースがタイトになるまでそれが常に待機しないことを前提としなければならないのですか?

ARCはコンパイル時のテクノロジです。ランタイムメモリヒープについては何も知らない。したがって、空間が狭くなるまでアイテムを解放するのを待つことはできません。あなたの質問に対する具体的な答えは、ARCが不要になったらすぐに何かをリリースするということです。

+0

または、別の言い方をする:* ARCはガベージコレクション*ではない。 –