Answers:
除了已经指出的内容之外,我还想详细说明后面的逻辑-viewDidUnload
。
实现它的最重要原因之一是UIViewController
子类通常还包含对视图层次结构中各个子视图的拥有引用。例如IBOutlets
,从笔尖加载时可以设置这些属性,也可以通过编程方式在内部设置这些属性-loadView
。
子视图的额外所有权是UIViewController
指,即使将其视图从视图层次结构中删除并释放以节省内存(视图也通过该视图释放了子视图),由于它们UIViewController
本身仍包含自己的未完成的视图,因此实际上不会释放它们也保留对这些对象的引用。释放UIViewController
这些对象的额外所有权可确保将它们重新分配以释放内存。
通常,从Nib或通过的实现重新创建并释放您在此处释放的对象,并在UIViewController
视图打开时重新设置这些对象。re-loaded
-loadView
还要注意,该UIViewController
view
属性是nil
在调用此方法时出现的。
如文档所述:
当视图控制器需要释放其视图以及与该视图关联的任何对象以释放内存时,在低内存条件下将调用它。
在相同的情况下dealloc
是不会叫。此方法仅在OS3及更高版本中可用。在iPhone OS 2.x中处理相同的情况真是太痛苦了!
2015年7月更新:应该注意,viewDidUnload
iOS 6 中已弃用该方法,因为“视图不再在低内存条件下清除,因此从不调用此方法。” 因此,现代建议是不要担心它和使用它dealloc
。
请记住,这viewDidUnload
是视图控制器中的方法,而不是视图中的方法。当视图卸载时,将调用该视图的 dealloc
方法,但是直到稍后才可以调用该视图控制器的 dealloc
方法。
如果收到内存不足警告,并且视图未显示(例如,在使用UIImagePickerController允许用户拍照时的任何时候都会发生这种情况),则视图将被卸载,并且此后需要重新加载。
结论:
视图控制器具有视图属性。通常,笔尖或一段代码将其他视图添加到该视图。这通常发生在-viewDidLoad方法内部,如下所示:
- (void)viewDidLoad {
[super viewDidLoad];
[self createManyViewsAndAddThemToSelfDotView];
}
另外,nib文件可以创建一个按钮并将其附加到视图控制器的视图。
在iPhone OS 2.2上,从系统调用-didReceiveMemoryWarning时,必须释放一些内容以释放内存。如果可以的话,您可以释放整个视图控制器的视图。或者只是其中消耗大量内存的内容。
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
现在,在新的OS 3.0中,有一个-viewDidUnload方法,当由于内存不足而将视图卸载后,将从系统中调用该方法(请纠正我:何时确切调用此方法?)
-viewDidUnload用于释放视图控制器本身和视图都拥有的所有对象。原因:如果视图控制器持有对视图子视图(即按钮)的引用,则将不会释放所引用的子视图,因为它们的保留计数> =1。在-viewDidUnload中释放它们之后,可以释放它们。从记忆里。
Apple不赞成使用viewWillUnload,现在您应该使用didReceiveMemoryWarning或dealloc释放objetcs。
在iOS 6中,现已弃用UIViewController的viewWillUnload和viewDidUnload方法。如果使用这些方法来释放数据,请改用didReceiveMemoryWarning方法。您也可以使用此方法释放对视图控制器视图的引用(如果未使用它)。在执行此操作之前,您需要测试视图不在窗口中。