我的 iOS 应用程序存在内存问题,对此我有几个问题。
首先,我正在使用 iOS 6 并且正在使用 ARC。
现在让我解释一下我的情况:
我有 2 个视图。从第一个视图中,如果我点击一个按钮,我会创建第二个视图(使用alloc
and init
)并使用以下代码将其显示为模态:
[self presentViewController:secondView animated:YES completion:^{
[secondView prepareToDraw]; // Function I use to start my computations and rendering
}];
有时,当计算完成时,我想关闭我的第二个视图并返回到第一个视图。我从第二个角度使用此代码:
[self dismissViewControllerAnimated:YES completion:^{
[self finished]; // Function I use to free some malloc
}];
我使用 Instruments Allocations and Leaks 运行我的应用程序,但我没有泄漏。
这是我的代码didReceiveMemoryWarning
:
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
if ([self isViewLoaded] && ([[self view] window] == nil)) {
self.view = nil;
[self tearDownGL];
if ([EAGLContext currentContext] == self.context) {
[EAGLContext setCurrentContext:nil];
}
self.context = nil;
}
// Dispose of any resources that can be recreated.
NSLog(@"Resources freed");
}
该tearDownGL
函数释放 OpenGLES 资源,如纹理、顶点数组、...
当我运行我的应用程序时,在第一个视图和第二个视图之间多次切换后,我收到内存警告,然后我的应用程序崩溃了。
这是我的问题:
1-应用程序是否会自动释放我的 UIImage、UIView 等控制器?如果没有,我如何在使用 ARC 时释放它们?我也看到了该viewDidUnload
功能,但正如文档所述,它已被弃用:
当控制器的视图从内存中释放时调用。(在 iOS 6.0 中已弃用。在内存不足的情况下不再清除视图,因此永远不会调用此方法。)
但是,如果在内存不足的情况下不再清除视图,如何释放更多内存以防止我的应用程序崩溃?我应该怎么办?
2-didReceiveMemoryWarning
我在我的 2 个控制器的函数上设置了一个断点。当我在模拟器上运行应用程序时,我会模拟内存警告。我可以看到didReceiveMemoryWarning
我的 2 个控制器调用了一次。但是如果我在我的第一个和第二个控制器之间切换几次,我的第didReceiveMemoryWarning
一个视图控制器会调用一次,但我的第二个视图控制器会调用几次。如果我切换 3 次,该函数将被调用 3 次。所以我想,当我“关闭”我的第二个视图以返回第一个视图时,第二个视图没有被释放并且仍然存在。为什么 ?我怎样才能强迫它被摧毁?(因为我不再使用它并创建一个新的)我在一个函数中创建了第二个视图控制器并且我不保留对它的任何引用(它不存储在类中)。