【发布时间】:2013-09-05 08:25:15
【问题描述】:
我的 iOS 应用存在内存问题,对此我有几个问题。
首先,我正在使用 iOS 6 并且正在使用 ARC。
现在让我解释一下我的情况:
我有 2 个视图。从第一个视图中,如果我点击一个按钮,我会创建第二个视图(使用 alloc 和 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- 我在我的 2 个控制器的 didReceiveMemoryWarning 函数上设置了一个断点。当我在模拟器上运行应用程序时,我会模拟内存警告。
我可以看到我的 2 个控制器调用了一次 didReceiveMemoryWarning。
但是,如果我在我的第一个和第二个控制器之间切换多次,didReceiveMemoryWarning 会为我的第一个视图控制器调用一次,但我的第二个视图控制器会调用多次。如果我切换 3 次,该函数将被调用 3 次。所以我想,当我“关闭”我的第二个视图以返回第一个视图时,第二个视图没有被释放并且仍然存在。为什么 ?我怎样才能强迫它被摧毁? (因为我不再使用它并创建一个新的)
我在一个函数中创建了第二个视图控制器,我没有保留对它的任何引用(它没有存储在类中)。
【问题讨论】:
标签: ios objective-c