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 调用),其中包含一个 tabBarController,里面有更多的 viewController。

我的问题是,每当我在任何 viewController 中收到 didReceiveMemoryWarning 时,我的主 Viewcontroller 中的纹理都会按预期释放,但由于某种原因我无法再次重新加载它们,所以第一次发生这种情况时,我得到了没有纹理的形状,但如果用户再次单击 infoButton 并尝试返回,则应用程序崩溃。

所以我的问题是,我应该不惜一切代价让 glView 保持活动状态,还是应该将其设置为 nil 并在收到此内存警告时释放它?我已经阅读了一些问题和 Apple 文档,说你应该重新创建这些东西。在 didReceiveMemoryWarning 中:

“您对这种方法的实现应该通过清除稍后可以重新创建(或从磁盘重新加载)的缓存数据对象来释放尽可能多的内存。”

我希望能够在用户返回 openGL 视图之前执行此操作,以便 UI 不会滞后。任何帮助将不胜感激。

4

1 回答 1

0

首先,让我注意到调用

   glView = nil;

不会向您的 EAGLView 发送释放,因此您在这里有内存泄漏(因为将其分配给 self.view 也会增加其保留计数器)。

你确定那viewDidUnload真的叫吗?它应该只用于当前未显示的视图。如果是这样,您能否添加有关崩溃/控制台日志类型等的更多信息?

考虑到泄漏的可能性,我认为该应用程序可能由于内存使用过多而被杀死。一个很好的提示是,如果您signal (0)在控制台日志的末尾看到 a。

于 2012-05-10T14:47:16.543 回答