0

私のコードでこのバグを理解するのに苦労しています。アプリが起動すると、メインの 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 ビューに戻る前にこれを実行できるようにしたいと考えています。どんな助けでも大歓迎です。

4

1 に答える 1

0

まず、呼び出しに注意させてください

   glView = nil;

EAGLView にリリースを送信しないため、ここでメモリ リークが発生します (self.view に割り当てると保持カウンタも増加するため)。

viewDidUnloadそれが実際に呼び出されていると確信していますか?現在表示されていないビューに対してのみ使用する必要があります。もしそうなら、クラッシュ/コンソールログの種類などについてさらに情報を追加できますか?

リークの可能性を考慮すると、メモリの過剰使用によりアプリが強制終了された可能性があると考えられます。signal (0)これに関する良いヒントは、コンソール ログの最後にa が表示されている場合です。

于 2012-05-10T14:47:16.543 に答える