什么时候UIViewController viewDidUnload被调用?

注意:这个问题已经过时了 – viewDidUnload已经被弃用了iOS 6。

什么时候UIViewController的viewDidUnload自动被调用? 是的,我知道,当视图卸载。 但是什么时候自动发生? 我怎样才能手动? 谢谢。

如果您在模拟器中发出内存警告(查看菜单),将调用附加到不可见视图的任何视图控制器。

这是因为默认情况下,视图控制器已经注册了内存警告通知,并且任何目前未被使用的视图都将被视图控制器卸载 – viewDidUnload方法在那里,这样你就可以清理任何你想要的东西,节省额外的内存(或者如果您保留了一些IBOutlet来帮助释放内存,否则将被卸载的视图释放)。

通常,在dealloc中释放的任何IBOutlet也应在此方法中释放(并将引用设置为nil)。

除了在模拟器中手动发出内存警告之外,还可以用编程方式发出内存警告

 - (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]; } 

每当viewcontroller的视图属性设置为nil时,调用-viewDidUnload ,无论是手动还是最常见的-viewDidUnload

iOS 6.x及更高版本

我知道这是一个老问题,但我觉得应该提交有关iOS 6中的viewDidUnload API的更改的答案,即iOS 6中的viewDidUnload不再被调用(完全不被使用)并且已被弃用。

viewDidUnload在低内存条件下调用。 我们应该卸载我们在viewDidLoad方法中加载的东西。 我们需要通过调用访问方法来放弃对象的所有权,将其设置为nil。 在sockets的情况下,对象释放自身,因此对象引用可以安全地设置为零。 如果不是一个综合的属性,那么我们首先需要释放的对象比我们设置为零。