什么时候调用UIViewController viewDidUnload?

时间:2009-08-17 02:27:02

标签: iphone uiviewcontroller

注意:此问题已过时 - iOS 6已弃用viewDidUnload

什么时候自动调用UIViewController的viewDidUnload?是的,我知道,当视图卸载时。但是什么时候会自动发生?我该如何手动完成?感谢。

5 个答案:

答案 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)

每当viewcontroller的view属性设置为nil时,都会调用

-viewDidUnload,无论是手动还是最常见的didReceiveMemoryWarning:

答案 3 :(得分:10)

iOS 6.x及更高版本

我知道这是一个较旧的问题,但我觉得应该提交一个关于iOS 6中viewDidUnload API更改的答案,即iOS 6 viewDidUnload中不再调用(根本不需要)并且已被弃用。

答案 4 :(得分:3)

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