由于内存有限,内存警告是正常 iOS 行为的一部分,尤其是现在支持多任务处理。
UIKit 不仅允许从视图控制器导航回来,还允许从现有视图控制器导航到其他视图控制器。在这种情况下,将分配一个新的 UIViewController,然后将其加载到视图中。旧的视图控制器将离开屏幕并变为非活动状态,但仍拥有许多对象——一些在自定义属性和变量中,而另一些在视图属性/层次结构中。就其视图对象而言,新的可见视图控制器也是如此。
由于移动设备的内存量有限,拥有这两组对象——一组在屏幕外视图控制器中,另一组在屏幕视图控制器中——可能难以处理。如果 UIKit 认为有必要,它可以回收一些屏幕外视图控制器的内存,这些内存无论如何都不会显示;UIKit 知道哪个视图控制器在屏幕上,哪个在屏幕外,毕竟,它是管理它们的那个(当您调用 presentModalViewController:animated: 或dismissModalViewControllerAnimated: 时)。因此,每当它感到有压力时,UIKit 都会生成一个内存警告,它会从视图层次结构中卸载并释放您的屏幕外视图,然后调用您的自定义 viewDidUnload 方法来为您的属性和变量执行相同的操作。UIKit 自动释放 self.view,然后允许我们在 viewDidUnload 代码中手动释放变量和属性。它适用于所有屏幕外视图控制器。
当系统内存不足时,它会触发 didReceiveMemoryWarning。屏幕外视图将在内存警告时被回收和释放,但您的屏幕视图不会被释放——它是可见的和需要的。如果您的类拥有大量内存,例如缓存、图像等,didReceiveMemoryWarning 是您应该清除它们的地方,即使它们在屏幕上;否则,您的应用程序可能会因系统资源过剩而终止。您需要重写此方法以确保清理内存;只要记住你打电话给[super didReceiveMemoryWarning];。
此处提供了更详细的解释:http: //myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/