ARC - 重组应用程序以防止由于内存而崩溃



我遇到了问题,我找不到自己的解决方案,所以我需要你的帮助。在下文中,我将解释我的应用程序结构,然后解释我的问题。

类管理屏幕上可见的视图。在 RootViewController 的 viewDidLoad 方法中,正在分配另外两个视图控制器。一个称为DocumentViewer,可以从应用程序中的任何位置作为modalViewController添加到视图中。另一个称为MapViewController,包含一个带有循环视频,图像和几个按钮的视图。这些按钮中的每一个都会导致 MapViewController.view 从 RootViewController.view 中删除,并在 RootViewController 中分配另一个 ViewController,然后将该视图添加到 RootControllers 视图中。我将把这些视图控制器称为NewViewController,以便您能够遵循。此视图切换是由 RootViewController 中名为 switchViews 的方法引起的。

现在,由 NewViewController 控制的视图在导航栏内包含一个分段控件。在此 ViewController 的 viewDidLoad 方法中,正在分配另外四个视图控制器,其中三个包含 webView,最后一个包含五个屏幕大小的图像。所有这些都存储在一个名为 viewArray 的数组中。每次更改分段控件的值时,都会调用一个方法,该方法删除数组中具有超级视图的所有视图,该视图始终仅是当前可见的视图,然后将视图添加为子视图,该子视图存储在 viewArray 中 segmentedControl 元素的索引处,因此索引为 0 的分段将加载 [viewArray objectAtIndex:0]。导航栏中的按钮调用 RootViewController 中的 switchViews 方法,以删除当前视图并再次添加 MapViewController.view。

所以这是我的应用程序,正如您可能已经猜到的那样,我遇到了内存警告问题。例如,当我在NewViewControllers视图中并调用DocumentViewer并将pdf加载到它的webView中时,我会收到内存警告并且应用程序崩溃。

由于我是第一次使用ARC,而且我对Objective-C也不是很有经验,我不知道在哪里将viewController分配设置为nil或类似的东西,以将内存使用保持在可接受的水平。

谁能告诉我需要在哪里进行更改或卸载内容以防止我的应用程序崩溃?或者,也许发布一个教程链接,解释如何防止此类问题?

ARC不是魔法:只是自动的。您仍然必须确保没有保留周期,否则内存将永远不会被回收,如果无法再访问这些对象,您实际上就会泄漏。

一个起点是清除和删除不可见的视图。

同样,使用工具运行,以便了解分配的来源 - 从一个视图跳到另一个视图,并查找离开视图时未释放的增长或对象(堆镜头分析对此有好处)。 在许多情况下,您应该能够从视图导航并返回,而不会增加堆。

最新更新