什么时候调用UIViewController viewDidUnload?

mk1*_*k12 45 iphone uiviewcontroller

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

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

Ken*_*ner 42

如果在模拟器中发出内存警告(在菜单中查看),则会为连接到不可见的视图的任何视图控制器调用此警告.

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

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

  • @ mk12兄弟,不要讨厌IB.我尽可能使用NIB,因为它会显着缩短开发时间.更少的开发时间=你得到更多的口袋.此外,UI设计师在您使用它时会爱上您(让您更有市场价值).Jast路过一些爱你的方式! (2认同)

joh*_*les 37

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

- (void)_simulateLowMemoryWarning {
  // Send out MemoryWarningNotification
  [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification
                                                      object:[UIApplication sharedApplication]];
  // Manually call applicationDidReceiveMemoryWarning
  [[[UIApplication sharedApplication] delegate] applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用计时器每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];
}
Run Code Online (Sandbox Code Playgroud)

  • 测试应用程序的绝妙主意. (6认同)

Rob*_*ier 17

-viewDidUnload每当viewcontroller的view属性设置为nil时调用,手动或最常见didReceiveMemoryWarning:.


Thu*_*ets 10

iOS 6.x及更高版本

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

  • 除此之外:如果你针对iOS 5进行部署,你仍然应该编写一个`viewDidUnload`实现,但是没有任何需要在iOS 6上运行的逻辑是至关重要的. (2认同)