ARC - 重构应用程序以防止因内存而崩溃

时间:2012-08-14 08:49:12

标签: objective-c memory uiviewcontroller automatic-ref-counting

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

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

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

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

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

有人可以告诉我需要更改或卸载内容以防止我的应用崩溃吗?或者发布一个教程的链接,解释如何防止这样的问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

同样,使用乐器运行,这样您就可以了解分配的来源 - 从视图跳转到视图并查看增长或离开视图时未释放的对象(堆镜头分析对此有利) 。在许多情况下,您应该能够从视图导航并在没有堆增长的情况下返回。