2009年12月11日金曜日

写真撮影後に viewDidLoad が呼び出される

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
UIImagePickerController を使って写真を撮影したのち、呼び出し元の UIViewConroller の viewDidLoadが呼び出されていることに気がついた。このメソッドはてっきり最初に一回だけ呼び出されるものと思っていたのでここへ初期化処理を書いておいたのだが、そのせいで写真撮影毎に初期化処理が呼び出されてしまった。また view上の UIImageView へ設定していた画像が表示されない。中身を確認すると nil になっていた。

調べてみると、どうもメモリ不足が原因で UIViewController が view を再作成しているのが原因ということだった。
2009-01-21 - f-shinの日記 - iPhoneアプリ開発グループ


実際、didReceiveMemoryWarning が呼び出されているのがわかった。

- (void)didReceiveMemoryWarning {
 // Releases the view if it doesn't have a superview.
 NSLog(@"didReceiveMemoryWarning");
 [super didReceiveMemoryWarning];
 // Release any cached data, images, etc that aren't in use.
}


おー、そうなのか。

参考本で紹介されていた下記のコードは使えないことがわかる(実際、OS v3.1.2の実機で画像が表示できない)。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissModalViewControllerAnimated:YES];
photoView.image =
 [info objectForKey:UIImagePickerControllerOriginalImage];   
}


なぜなら photoView(UIImageView)はメモリ不足が生じた場合、この直後に再作成されるので。


対策方法の1つとしては viewを開放させない(再作成させない)ことが紹介されていた。
もう一つは viewが再作成されることを前提に実装する方法。


正攻法はやっぱり後者なんだろうな。
その場合、撮影した画像は UIViewController のプロパティへ直接設定するのではなく別の場所へ保存し、表示する時にそれを使うようにする必要がある。

0 件のコメント:

コメントを投稿