注意:此问题已过时 - iOS 6已弃用viewDidUnload
。
什么时候自动调用UIViewController的viewDidUnload?是的,我知道,当视图卸载时。但是什么时候会自动发生?我该如何手动完成?感谢。
答案 0 :(得分:42)
如果您在模拟器中发出内存警告(在菜单中查看),则会为连接到不可见的视图的任何视图控制器调用此内容。
这是因为默认情况下为视图控制器注册了内存警告通知,并且视图控制器将卸载当前未使用的任何视图 - viewDidUnload方法在那里,以便您可以清理其他任何您想要的内容,节省额外的内存(或者如果你保留了一些IBOutlets来帮助释放内存,否则将被卸载的视图释放)。
通常,您在dealloc中发布的任何IBOutlet也应该在此方法中释放(并且引用设置为nil)。
答案 1 :(得分:37)
除了在模拟器中手动发出内存警告外,您还可以使用
以编程方式发出一个- (void)_simulateLowMemoryWarning {
// Send out MemoryWarningNotification
[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification
object:[UIApplication sharedApplication]];
// Manually call applicationDidReceiveMemoryWarning
[[[UIApplication sharedApplication] delegate] applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];
}
然后,您可以使用计时器
每5秒发生一次static NSTimer *gLowMemoryTimer = nil;
- (void)stopLowMemoryTimer {
[gLowMemoryTimer invalidate];
gLowMemoryTimer = nil;
}
- (void)startLowMemoryTimer {
if (gLowMemoryTimer) {
[self _stopLowMemoryTimer];
}
gLowMemoryTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(_simulateLowMemoryWarning) userInfo:nil repeats:YES];
}
答案 2 :(得分:17)
-viewDidUnload
,无论是手动还是最常见的didReceiveMemoryWarning:
。
答案 3 :(得分:10)
iOS 6.x及更高版本
我知道这是一个较旧的问题,但我觉得应该提交一个关于iOS 6中viewDidUnload
API更改的答案,即iOS 6 viewDidUnload
中不再调用(根本不需要)并且已被弃用。
答案 4 :(得分:3)
在低内存条件下调用viewDidUnload。我们应该卸载我们在viewDidLoad方法中加载的东西。我们需要通过调用accessor方法将其设置为nil来放弃对象的所有权。在出口的情况下,对象释放自身,因此对象参考可以安全地设置为零。如果不是合成属性,那么我们首先需要释放对象而不是设置为nil。