Выпуск в viewDidUnload и dealloc как?
Некоторое время я предполагал, что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]
во всех моих методах dealloc на контроллерах? Хуже, чем может случиться, это то, что я установил свойство в ноль дважды, верно?