Некоторое время я полагал, что viewDidUnload
всегда вызывается, когда контроллер освобождается. Это правильное предположение?
Я только что исследовал некоторые странности и установил точку останова в viewDidUnload
своего контроллера, и это dealloc
. Похоже, что dealloc
вызывается, но метод viewDidUnload
никогда не вызывается. Я даже добавил self.view = nil
к своему dealloc
, но он все равно не вызвал его.
Означает ли это, что сохраненные объекты представления, которые я выпускал в методе viewDidUnload
, также необходимо освободить в моем методе dealloc
, чтобы быть уверенным, что они действительно исчезнут?
Я знаю, что в StackOverflow есть много других вопросов о viewDidUnload
, но ни один из них конкретно не касается этой проблемы, касающейся дублирования заявлений о выпуске между двумя методами.
Более конкретный пример в новом проекте на SDK 3.1.2:
@implementation TestViewController
@synthesize label;
- (IBAction)push {
TestViewController *controller = [[[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil] autorelease];
[self.navigationController pushViewController:controller animated:YES];
}
- (void)viewDidUnload {
self.label = nil;
NSLog(@"viewDidUnload was called");
}
- (void)dealloc {
[super dealloc];
NSLog(@"label retain count: %i", [label retainCount]);
}
@end
Мой делегат приложения создает простой контроллер навигации с одним из них в качестве корневого контроллера. Когда я нажимаю кнопку, связанную с push
3 раза, а затем трижды нажимаю кнопку «Назад», создается следующий результат.
ViewDidUnloadTest[2887:207] label retain count: 2
ViewDidUnloadTest[2887:207] label retain count: 2
ViewDidUnloadTest[2887:207] label retain count: 2
Что на 2 выше, чем я мог бы подумать. Один раз сохраняется представлением и один раз контроллером. Но после dealloc
я ожидал, что представление исчезнет, выпустив мою метку, а контроллер исчезнет, вызывая viewDidUnload
и отпуская его. Хотя там может быть autorelease
, сбивающее счет на этом этапе.
Но по крайней мере ясно, что viewDidUnload
вообще не вызывается, что противоречит этому ответу здесь: Всегда ли вызываются viewDidUnload и dealloc при разрыве UIViewController?
Возможно, мне следует просто вызвать [self viewDidUnload]
во всех моих методах освобождения контроллеров? Хуже того, что я дважды устанавливаю для свойства значение nil, верно?