web-dev-qa-db-ja.com

メモリ警告を受け取りました。 UIImagePickerControllerを表示する場合、Level = 1

これは私を夢中にさせています!!!

SourceType = UIImagePickerControllerSourceTypeCameraでUIImagePickerControllerを表示しようとすると、常に「受信メモリ警告。Level= 1」が表示されます。

以下は、私が設定したviewDidLoadのコードです。

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Set card table green felt background
    self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]];


    // Init UIImagePickerController
    // Instantiate a UIImagePickerController for use throughout app and set delegate
    self.playerImagePicker = [[UIImagePickerController alloc] init];
    self.playerImagePicker.delegate = self;
    self.playerImagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}

そして、ここに私がそれをモーダルに提示する方法があります。

- (IBAction) addPlayers: (id)sender{
[self presentModalViewController:self.playerImagePicker animated:YES];

}

結果... UIImagePickerが表示され、ブームが発生します...メモリ警告が表示されます...毎回!興味深いことに、sourceType = UIImagePickerControllerSourceTypePhotoLibraryに切り替えると、すべてが正常に機能します。

一体何が欠けているか間違っているのですか?カメラを見せて、写真を撮って保存するだけです。

FYI-私は私の3GSデバイスでテストしています。

助けることができる人に感謝します:)

22
wgpubs

これは 非常に一般的 です。クラッシュすることなくメモリ警告を処理し、続行するのに十分なスペースがある限り、狂わせないでください。

17
progrmr

ボタンが1つしかなく、ボタンをクリックしてからカメラを開く非常にシンプルなアプリを作成する場合でも、アプリが使用したメモリの量ではありません。 iPhone 3GS、iPad 2、iPod touch 3Gでテストしました。 iPhone 3GSでのみ発生しました。アプリを実行する前にデバイスを再起動した場合、これはもう起こりません。

別の実際の解決策は、viewControllerでコード_[super didReceiveMemoryWarning]_をコメント化することです。

_- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}
_

IOS 4.3.2を搭載したiPhone 3GSで多くのテストを行った後、ロジックは次のようになる可能性があることに気づきました。 > ApplicationDelegateのメソッドapplicationDidReceiveMemoryWarning:(UIApplication *)applicationが呼び出されます->次に、ViewControllerのメソッド_didReceiveMemoryWarning:_が呼び出されます->次に、viewDidUnload->次に、viewDidLoad

次に、いくつかのビューが解放され、現在のビューが予期しないビューを指していることがわかります。

デフォルトでは、_[super didReceiveMemoryWarning]_はViewControllerのdidReceiveMemoryWarningメソッドが呼び出されたときに実行されます。コメント、および_viewDidUnload:_および_viewDidLoad:_メソッドは呼び出されません。これは、メモリ警告が完全に無視されたことを意味します。それが私たちが期待していたことです。

6
Navy

今、私は4.0にアップグレードした後、それは私のアプリにも起こります-3.1以前は警告はありませんでした。

実際、前にも言ったように、問題はないはずです。ただし、これにより、ビューが再度読み込まれ、viewDidLoadが呼び出されます。 viewDidLoadでビューを初期化しているため、これによりアプリがめちゃくちゃになります。

コメントと同じように、これはビューを1回だけロードすることに依存する他の多くのアプリでも発生する可能性があります。

5
user387184

それは私のアプリでも起こりました。iOS4.0でも同じことをしました。一貫性はありませんでしたが、最も一般的な原因は、UIImagePickerControllerインスタンスを作成し、アルバムの1つに格納されている大きな写真に移動したことです。
didReceiveMemoryWarningメソッドで状態を永続化し、viewDidLoadメソッドで状態からロードすることで修正されました。 1つの注意点は、アプリケーションの正しいポイントで状態永続化ファイルをクリアすることを忘れないことです。私にとっては、通常の状況では関連するUIViewControllerを残していました。

4
DenTheMan

UIImagePickerControllerを開くときにもメモリ警告が表示されます。私も4.01を使用しています。しかし、さらに、UIImagePickerControllerはシャッターを閉じるアニメーションを実行していて、画面上でシャッターを閉じた状態で停止しています。

メモリ警告に対するUIImagePickerControllerの動作は、それ自体を閉じるようです。 didReceiveMemoryWarningメソッドで親のViewControllerからUIImagePickerControllerを閉じることもできましたが、それはひどいユーザーエクスペリエンスにつながるでしょう。

誰かがこの問題を見たことがありますか? UIImagePickerControllerがそれ自体をシャットダウンしないようにメモリ警告を処理する方法はありますか?

1
eddy

UIImagePickerControllerDelegateは、大量のメモリアセット(画像やビデオなど)をキャプチャするので、メモリを大量に消費します。したがって、最初から中程度のキャプチャ設定を指定してください。開始点として、品質が必要ない場合はこれを減らします。

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.videoQuality=UIImagePickerControllerQualityTypeMedium;

次に、これらのアセットをキャプチャして使用した後。アプリケーションの一時フォルダから一時ファイルを削除します。余分な強迫ステップかもしれませんが、それは良い習慣です:

NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:[lastCapturedFile substringFromIndex:7] ]) {
    NSError *error;
    // Attempt to delete the folder containing globalDel.videoPath
    if ([fileManager removeItemAtPath:[lastCapturedFile substringFromIndex:7] error:&error] != YES) {
        NSLog(@"Unable to delete recorded file: %@", [error localizedDescription]);
    } else {
        NSLog(@"deleted file");
    }
}

上記では、デリゲートによって作成されたファイルをクリアしています。場合によっては、トランスコードまたは独自のアセットを作成している場合は、そのファイルを含むフォルダーを削除します。上記のメモでは、ファイルマネージャが気に入らないため、URL文字列の「file://」の部分を削除しています。

[lastCapturedFile substringFromIndex:7]

考慮すべき他のことは、そのアセットで何をしているのかについてのさまざまなドキュメントで説明されています-トランスコーディング、画像サイズの縮小など。 AVFoundationが表示されている場合、UIImagePickerViewControllerを使用したトランスコーディングはクラッシュすることに注意してください。

1
elliotrock

私はここ数日、同じ問題に苦しんでいます。ただし、iPhone 4をリセットする(メモリをクリアする)ことで問題が解決するため、実際にはアプリの問題ではありません。

レベル1または2のメモリ警告により、UIimgPickerControllerデリゲートが自身をオフロードするようトリガーされるようです。同じことが私のアプリでもデリゲートのデリゲートで起こります(可能です)。ただし、メモリ警告の後、デリゲート(およびデリゲート)が再度読み込まれ、viewDidLoadはそこにあるコードを実行します。

これがUIimgPickerControllerの使用中にのみ発生するかどうかはわかりません。すべてのテストに非常に時間がかかるためです。

UIimgPickerControllerを表示しているときにviewDidLoadおよびviewWillAppearのコードが実行されないようにするために、いくつかの追加コードを記述できますが、それは上品ではありませんよね?

アプリをテストしているためにメモリ不足になっている可能性があります。いくつかのメモリリークがあるため、デバッグするたびにこの問題に取り組んでいる可能性が非常に高くなります。

1
Jaap