我对在基于 Nib 的UIViewController
s 中究竟发生了什么感到有点困惑。生成UIViewController
子类时,模板在方法中包含非常具体的注释viewDidUnload
:
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
这适用于哪些子视图?
- 我初始化的那些
viewDidLoad
?(我会说是的) - 我初始化的那些
initWithNibName
?(我会说不) - 引用 Nib 中对象的 IBOutlets?
如果我像这样使用视图控制器:
MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[controller release];
在这种情况下,我认为保存对子视图的引用的实例变量是否被释放并不重要,viewDidUnload
或者一旦视图控制器从堆栈中弹出就应该被调用,所以我不妨按照苹果所说的去做并释放dealloc
实例dealloc
变量 onviewDidUnload
而不是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];
MyViewController
如果我在 中释放 IBOutlet会发生什么viewDidUnload
?我可以指望在下一个对它有新的引用viewDidLoad
吗?
换句话说:在 之后视图本身会发生什么viewDidUnload
?如果再次推动控制器,它是否会从 Nib 释放并重新加载?或者视图是否保留在内存中?如果是这样,网点之前是否会重新设置viewDidLoad
?
如果视图保留在内存中并且插座在之前重新设置viewDidLoad
或每次按下控制器时都重新加载,我认为释放插座是正确的viewDidUnload
(即使在第一种情况下它并不重要)。但除此之外(特别是如果视图保留在内存中并且未重新设置插座),viewDidUnload
对于我提出的用例来说,释放子视图是错误的,我正确吗?