調べてみると、どうもメモリ不足が原因で 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 のプロパティへ直接設定するのではなく別の場所へ保存し、表示する時にそれを使うようにする必要がある。