很多人都误解了重点viewDidUnload
。特别是,它是not对应于viewDidLoad
。在大多数情况下,您的视图控制器将被释放而无需viewDidUnload
被召唤。为此,您应该never考虑取消分配viewDidUnload
分配的适当平衡viewDidLoad
.
viewDidUnload
已被 Apple 弃用。反对使用它的最佳论点可能是它的标题(我已经包装了):
- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0); // Called after the view
// controller's view is released and set to nil. For example, a memory warning
// which causes the view to be purged. Not invoked as a result of -dealloc.`
那么什么是viewDidUnload
?其背后的想法是视图从视图控制器后面卸载。这使您有机会分离指向它的任何指针并清除可以轻松重建的任何信息。你的观点将probably被重新加载,此时您需要重建所有缓存。苹果公司是这样描述的:
当发生内存不足的情况并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。此方法在视图控制器的视图被释放后调用,并且是您执行任何最终清理的机会。如果您的视图控制器存储对视图或其子视图的单独引用,则应使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但由于视图消失而不再需要的任何对象的引用。您不应使用此方法来发布用户数据或任何其他无法轻松重新创建的信息。
请记住,将对对象的引用归零viewDidUnload
现在应该没有必要了。如果您按照 Apple 的建议使用 ARC,则您的视图出口会将弱引用归零。不用你写,它们就会自动被清空viewDidUnload
!
此外,清除缓存信息更适合didReceiveMemoryWarning
,所以你可能应该这样写:
您可以覆盖此方法以释放视图控制器使用的任何额外内存。如果这样做,此方法的实现必须在某个时刻调用超级实现,以允许视图控制器释放其视图。如果你的视图控制器持有对视图层次结构中视图的引用,你应该在viewDidUnload
方法代替。
一般来说,人们放入的东西viewDidUnload
更好地处理在viewDidDisappear
or dealloc
。唯一剩下的就是viewDidUnload
使任何一个为零your当视图控制器仍然打开时,可以在视图重新加载后的某个时刻需要时重建缓存,而不会丢失数据。 (并且,再次,这应该在didReceiveMemoryWarning
.) 这些缓存应该是惰性构建的;当您的应用程序再次需要它们时,它会悄悄地重建它们。
那么你应该做什么viewDidUnload
?如果您使用 ARC:什么也没有。连写都不用写。事实上,自从写这个答案以来,苹果已经弃用了viewDidUnload
.
For CGContextRelease
, the CGContext
资源不是 Objective-C 对象。 (你指出了这一点,但我想为后代重复一遍。)因此,它不能被 ARC 自动释放。您负责确保它被释放并被置空,就像旧的手动保留释放(MRR)内存管理方案一样。
如果你把这段代码放入viewDidUnload
,不能保证它会被调用。必须要进去dealloc
. You could把它放进去viewDidUnload
也一样,但是……
And so:
- 没有必要或没有帮助。与视图层次结构相比,您的实例变量很小。
- 没有必要或没有帮助。与视图层次结构相比,您的属性是微不足道的(只要您的属性不是对视图层次结构的强引用)。
- 这会导致内存泄漏,因为
dealloc
通常会被调用而无需viewDidUnload
.
- 没有必要或没有帮助。参见第 1 点和第 2 点。