9

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 クラスのインスタンスをきれいに作成および破棄する方法についてのアドバイスはありますか?

4

4 に答える 4

4

NIB から 2 番目のビュー コントローラーを読み込んでいますか? その場合は、関連付けられているメモリを正しく解放していることを確認する必要があります。

私のプロジェクトでは、典型的な NIB ベースのビュー コントローラーがどのように見えるかを次に示します。

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
于 2009-03-09T02:17:32.300 に答える
1

所有権の連鎖にサイクルはありますか? 何かのようなもの:

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

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

これらのビュー コントローラーを破棄するときにこのサイクルを明示的に中断しないと、リークが発生します。

また、nib ファイルからロードされたすべてのトップ レベル オブジェクトが不要になったときに解放する責任があると思います。

于 2009-03-05T20:45:29.813 に答える
0

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

于 2009-10-23T20:28:39.110 に答える