在UIViewController的viewDidUnload中发布IBOutlets?

Rap*_*ert 7 iphone objective-c uiviewcontroller nib ios

我对基于Nib的UIViewControllers中发生的事情感到有点困惑.生成UIViewController子类时,模板在viewDidUnload方法中包含非常具体的注释:

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
Run Code Online (Sandbox Code Playgroud)

这适用于哪些子视图?

  • 那些我初始化的viewDidLoad?(我会说是的)
  • 那些我初始化的initWithNibName?(我会说不)
  • 引用笔尖中的对象的IBOutlets?

如果我像这样使用视图控制器:

MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[controller release];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想这没有多大关系是否持有到子视图引用实例变量被释放viewDidUnloaddealloc因为dealloc应该得到尽快视图控制器从堆栈中弹出,所以我还不如做苹果所谓的说,释放实例变量viewDidUnload而不是dealloc.

但是假设我用作MyViewController可以多次推送的实例变量:

if(self.myViewController == nil) {
    self.myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
}
//Change some state which should be reflected in the view
self.myViewController.someProperty = someValue;
[self.navigationController pushViewController:self.myViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

MyViewController如果我发布IBOutlet 会发生什么viewDidUnload?我可以指望在下一个新的参考viewDidLoad吗?

换句话说:之后视图本身会发生什么viewDidUnload?如果再次按下控制器,是否从Nib释放并重新加载?或者视图是否留在内存中?如果是这样,出口之前viewDidLoad是否重新设置?

如果视图保留在内存中并且viewDidLoad每次按下控制器之前重新设置插座或重新加载插座,我认为释放插座是正确的viewDidUnload(即使在第一种情况下无关紧要).但除此之外(特别是如果视图保留在内存中并且没有重新设置插座),发布子视图viewDidUnload对于我提供的用例是错误的,我是否正确?

Can*_*der 7

UIViewController文档,内存管理部分:

发生低内存警告时,如果UIViewController类知道它可以重新加载或稍后再次重新创建它们,则该类会清除其视图.如果发生这种情况,它还会调用该viewDidUnload方法,让您的代码有机会放弃与视图层次结构相关联的任何对象的所有权,包括使用nib文件加载的对象,在viewDidLoad方法中创建的对象以及在运行时延迟创建的对象.添加到视图层次结构中.通常,如果视图控制器包含出口(属性或包含IBOutlet关键字的原始变量),则应使用该viewDidUnload方法放弃这些出口的所有权或您不再需要的任何其他视图相关数据.

因此,您不仅可以释放您的插座viewDidUnload,这是首选和推荐的方式.

是的,您可以指望在viewDidLoad调用时让您的出口指向有效对象.再次从UIViewController文档中,viewDidLoad:

在视图控制器将其关联的视图加载到内存后调用此方法.