Я немного сбит с толку относительно того, что происходит именно в UIViewController
s на основе Nib. При создании подкласса UIViewController
шаблон содержит очень специфический комментарий в методе viewDidUnload
:
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
К каким подпредставлениям это относится?
- Те, которые я инициализировал в
viewDidLoad
? (Я бы сказал да)
- Те, которые я инициализировал в
initWithNibName
? (Я бы сказал нет)
- IBOutlets, которые ссылаются на объекты в Nib?
Если я использую контроллер вида следующим образом:
MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[controller release];
В этом случае я полагаю, что не имеет большого значения, будут ли переменные экземпляра, содержащие ссылки на подпредставление, освобождены в viewDidUnload
или dealloc
, поскольку dealloc
должен вызываться, как только контроллер представления извлекается из стека. так что я мог бы так же поступить, как Apple, и выпустить переменные экземпляра в 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];
Что происходит в MyViewController
, если я выпускаю IBOutlet в viewDidUnload
? Могу ли я рассчитывать на получение новой ссылки на него в следующий viewDidLoad
?
Другими словами: что происходит с самим видом после viewDidUnload
? Выпускается ли он и перезагружается ли из Nib, если контроллер снова нажимается? Или вид остается в памяти? И если да, перезапускаются ли розетки до viewDidLoad
?
Если или представление остается в памяти, а выходы переустанавливаются до viewDidLoad
или перезагружаются при каждом нажатии контроллера, я полагаю, было бы правильным сбросить выходы в viewDidUnload
(даже если в первый случай это не важно). Но в противном случае (в частности, если представление остается в памяти и выходы НЕ переустанавливаются), освобождение подпредставлений в viewDidUnload
неправильно для представленного мной варианта использования, я прав?