質問

UIImagePickerControllerのインスタンスの作成と破棄に関する既知のメモリリークの問題と同様に、UIViewControllerクラスのインスタンスに関する同様の問題を見つけています。 UIImagePickerControllerを使用するための推奨される方法は、インスタンスを一度作成し、アプリケーションの存続期間中それを保持することです。ただし、他の場所で必要になる可能性のあるメモリを使い果たします。

私が扱っている状況には、UIViewControllerクラスの2つのインスタンスが関係しています。起動時に、最初のインスタンスが作成され、そのビューが別の「メイン」に追加されます。 MainWindow.xibの一部であるUIViewControllerクラス。この最初のインスタンスには、「情報」があります。タップすると、UIViewControllerクラスの新しいインスタンスに切り替えられるボタン(まだ作成されていない場合)。 「メイン」 UIViewControllerは、通常のフリップアニメーションでこの切り替えを管理します。基本的なセットアップについては、「iPhone開発の開始:iPhone SDKの調査」をご覧ください。デイブ・マークの本。

発生する問題は、" info"ボタンが最初にタップされると、メモリが新しい2番目のUIViewControllerインスタンスに割り当てられ、アプリケーションが終了するまで解放されません。この情報ビューの要素数により、インスタンス化されると約1MBのメモリが使用され、そのビューがスーパービューに追加されます。このインスタンスを一貫して破棄および再作成しようとすると、UIImagePickerControllerクラスのインスタンスに同じことを行おうとした場合と同様に、メモリリークが発生します。根本的な原因は2つのクラスで同じだと思います。

私の問題の核心は、ユーザーにカメラで写真を撮らせる前に、できるだけ多くのメモリを解放する必要があることです。ただし、ユーザーが写真を撮影し、最初に結果の画像を見ると、「情報」をタップすることができます。最初のUIViewControllerインスタンスに存在するボタン。タップすると、「メイン」 UIViewControllerは、既存のUIViewControllerのビューを削除し、情報画面のビューに置き換えます。情報画面には「戻る」があります。ビューを元に戻すボタン。ただし、ユーザーが情報画面を離れてカメラで別の写真を撮ることを選択した場合、情報画面に割り当てられたメモリはまだメモリ内にあります。

UIImagePickerControllerクラスは、内部参照と「imagePickerController:didFinishPickingImage」を解放する前に2メガピクセルの画像を処理する間、一時的にほぼ15〜18MBを使用します。デリゲートが呼び出されます。情報ボタンを使用して2番目のUIViewControllerインスタンスが作成され、ユーザーが別の写真を撮ることを選択すると、メモリ不足のアラートが発生します。

私の場合、情報ボタンをタップしてもしなくても、写真を何度も撮ってもメモリはリークしませんが、iPhoneのバックグラウンドプロセスに関するその他の問題(Safariなど)が制御できないため、カメラなどを操作している間は、できるだけ多くのメモリを解放する必要があります。

メモリがリークしないようにUIViewControllerクラスのインスタンスをきれいに作成および破棄する方法に関するアドバイスはありますか?

役に立ちましたか?

解決

NIBから2番目のView Controllerをロードしていますか?その場合、関連するメモリを正しく解放していることを確認する必要があります。

これは、プロジェクトでの典型的なNIBベースのView Controllerの外観です。

SomeViewController.h

@interface SomeViewController : UIViewController {
    UILabel *someLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *someLabel;

@end

SomeViewController.m

@implementation SomeViewController

@synthesize someLabel;

- (void)dealloc {
    // Release our retained IBOutlets
    self.someLabel = nil;
    [super dealloc];
}

@end

他のヒント

メモリ使用量を削減する1つの方法は、画像のサイズを任意のサイズに変更することです(もちろん、320x480の画像が必要な場合を除きます)。私の場合、それは大いに役立ちました。

あなたが話している2番目のViewControllerは変わりますか?そうでない場合は、シングルトンにして同じインスタンスを使用するのが最善です。 ViewControllerで使用される値はいつでも変更できます。 この記事は、シングルトンオブジェクトを作成する方法を説明しています(コード付き)

こちらの別の記事は、シングルトンクラスの使用方法を示しています(ただし、ユースケースでは、シングルトンの使用方法が明確になります)

UIImagePickerControllerのシングルトンオブジェクトも作成することをお勧めします。

所有権のチェーンにサイクルはありますか?次のようなもの:

@interface FirstViewController: UIViewController {
  SecondViewController *secondViewController;
}
@end

@interface SecondViewController: UIViewController {
  FirstViewController *firstViewController;
}
@end

これらのView Controllerを破棄するときにこのサイクルを明示的に中断しないと、それらはリークします。

また、nibファイルから読み込まれたすべての最上位オブジェクトを、不要になったときに解放するのはあなたの責任だと思います。

おそらく、情報ビューに移行する前に画像を保存できます。保存した後、イメージをリリースしてから、情報ビューに移行します。ユーザーが戻る場合は、フォルダーから画像を読み込みます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top