在我的代码中找出这个错误时遇到了很多麻烦。当我的应用程序启动时,我的主 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 不会滞后。任何帮助将不胜感激。