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

Ответы на вопрос(1)

Ваш ответ на вопрос