0

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

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

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

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

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

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

4

2 回答 2

1

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

同样,使用工具运行,以便您了解分配的来源——从一个视图跳到另一个视图,并寻找在您离开视图时没有释放的增长或对象(堆射击分析对此很有用)。在许多情况下,您应该能够在没有堆增长的情况下从视图导航并返回。

于 2012-08-14T09:08:12.310 回答
1

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

于 2012-08-14T09:03:01.270 回答