私のコードでこのバグを理解するのに苦労しています。アプリが起動すると、メインの ViewController には、次のようにビュー プロパティとして openGL ビューが設定されます。
- (void) loadView {
glView = [[EAGLView alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
[glView setAnimationFrameInterval: kAnimationFrameInterval];
[glView startAnimation];
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *infoImage = [UIImage imageNamed:@"info.png"];
[infoButton setImage:infoImage forState:UIControlStateNormal];
[infoImage release];
infoButton.showsTouchWhenHighlighted = YES;
[infoButton addTarget:self action:@selector(showInfo) forControlEvents:UIControlEventTouchUpInside];
infoButton.frame = CGRectMake(0.0f, 0.0f, 48.0f, 48.0f);
infoButton.clipsToBounds = NO;
[glView addSubview:infoButton];
glView.contentMode = UIViewContentModeCenter;
self.view = glView;
}
そして
- (void)viewDidUnload {
glView = nil;
[super viewDidUnload];
}
ユーザーが infoButton をクリックすると、このビュー コントローラーは (showInfo から呼び出される) モーダル ビュー コントローラーを表示します。
私の問題は、任意の viewController で didReceiveMemoryWarning を受け取るたびに、メインの Viewcontroller からのテクスチャが期待どおりに解放されることですが、何らかの理由でそれらを再度リロードできないため、最初に発生したときにテクスチャのない形状を取得します。しかし、ユーザーが再度 infoButton をクリックして戻ろうとすると、アプリがクラッシュします。
したがって、私の質問は、glView をすべてのコストで有効にしておく必要がありますか、それとも nil に設定して、このメモリ警告が表示されるたびに解放する必要がありますか? いくつかの質問と Apple のドキュメントを読んで、このようなものをもう一度作成する必要があると言っています。didReceiveMemoryWarning で:
「このメソッドの実装では、キャッシュされたデータ オブジェクトを削除して、後で再作成 (またはディスクから再読み込み) できるようにすることで、できるだけ多くのメモリを解放する必要があります。」
UI が遅れないように、ユーザーが openGL ビューに戻る前にこれを実行できるようにしたいと考えています。どんな助けでも大歓迎です。