UIImagePickerController のインスタンスの作成と破棄に関する既知のメモリ リークの問題と同様に、UIViewController クラスのインスタンスに関しても同様の問題が見つかりました。UIImagePickerController を使用するための推奨される方法は、インスタンスを一度作成し、アプリケーションの存続期間中それを維持することです。
私が扱っている状況には、UIViewController クラスの 2 つのインスタンスが含まれます。起動時に、最初のインスタンスが作成され、そのビューが MainWindow.xib の一部である別の「メイン」UIViewController クラスに追加されます。この最初のインスタンスには「情報」ボタンがあり、タップすると UIViewController クラスの新しいインスタンスに切り替わります (まだ作成されていない場合)。「メイン」の UIViewController は、通常のフリップ アニメーションでこの切り替えを管理します。基本的なセットアップは、Dave Mark による本「Beginning iPhone Development: Exploring the iPhone SDK」に記載されています。
発生する問題は、「情報」ボタンが最初にタップされると、メモリが新しい 2 番目の UIViewController インスタンスに割り当てられ、アプリケーションが終了するまで解放されないことです。この情報ビューの要素数が原因で、インスタンス化されてビューがスーパービューに追加されると、約 1MB のメモリが使用されます。このインスタンスを一貫して破棄して再作成しようとすると、UIImagePickerController クラスのインスタンスに対して同じことをしようとした場合と同様に、メモリ リークが発生します。根本原因は 2 つのクラス間で同じであると思われます。
私の問題の核心は、ユーザーがカメラで写真を撮れるようにする前に、できるだけ多くのメモリを解放する必要があることです。ただし、ユーザーが写真を撮り、結果の画像を初めて見ると、最初の UIViewController インスタンスにある「情報」ボタンをタップできます。タップすると、「メイン」の UIViewController は既存の UIViewController のビューを削除し、情報画面のビューに置き換えます。情報画面には、ビューを元に戻すための「戻る」ボタンがあります。ただし、ユーザーが情報画面を離れてカメラで別の写真を撮ることを選択すると、情報画面に割り当てられたメモリはまだメモリ内にあります。
UIImagePickerController クラスは、内部参照を解放する前に 2 メガピクセルの画像を処理し、"imagePickerController:didFinishPickingImage" デリゲートが呼び出される間、一時的に約 15 ~ 18 MB を使用します。情報ボタンを使用して 2 番目の UIViewController インスタンスが作成され、ユーザーが別の写真を撮ることを選択すると、メモリ不足のアラートが発生します。
私の場合、情報ボタンをタップして、またはタップせずに何度も写真を撮っても、技術的にメモリがリークすることはありませんが、iPhone(Safariなど)のバックグラウンドプロセスに関する他の問題が原因で、制御できないため、解放する必要がありますカメラなどを操作しながら、できるだけ多くのメモリを使用してください。
メモリがリークしないように UIViewController クラスのインスタンスをきれいに作成および破棄する方法についてのアドバイスはありますか?