UINavigationController: Когда отправленное представление получает сообщение Dealloc? - PullRequest
13 голосов
/ 05 февраля 2010

Я ожидаю, что после нажатия на контроллер представления мне нужно будет освободить меня от владения контроллером представления, как я сделал ниже.

CustomViewController *nextViewController = [[CustomViewController alloc] initWithNibName:@"CustomView" bundle:nil];
[[self navigationController] pushViewController:nextViewController animated:YES];
[nextViewController release];

После того, как я это сделаю, я предполагаю, что навигационный контроллер владеет этим объектом и по окончании освободит его, что вызовет Deloc на моем customViewController. Я ожидаю, что это произойдет, когда я нажму кнопку «Назад» на панели навигации, и представление больше не отображается. Этого не происходит, хотя. Я добавил NSLog (@ "CustomViewController действительно получил dealloc") в метод dealloc CustomViewController, но он никогда не печатается. Это нормальное поведение?

Контроллер навигации просто делает что-то вроде сохранения этого объекта на тот случай, если он ему нужен в какой-то момент? Избавится ли он от этого, когда память начнет исчерпываться? Я пытался симулировать предупреждение о нехватке памяти, но ничего не происходит. У меня есть ощущение, что ответом на этот вопрос будет то, что я не должен так сильно волноваться и следовать стандартной процедуре сохранения / освобождения / автоматического выпуска. Тем не менее, кто-нибудь еще углубился в это и нашел абсолютный ответ?

1 Ответ

14 голосов
/ 06 февраля 2010

«Контроллер навигации просто делает что-то вроде сохранения этого объекта на тот случай, если он ему понадобится в какой-то момент?»

Да. Это именно то, что он делает. Тем не менее, он будет отправлять вам сообщения viewDidLoad и viewDidUnload. И именно здесь вы должны выделять и освобождать ресурсы, которые использует ваш viewcontroller.

Обратите внимание, что viewDidUnload будет вызываться только тогда, когда система считает, что ей необходимо освободить память.

Если вам нужен более непосредственный контроль над тем, когда что-то загружается и освобождается, то лучшим местом могут быть viewWillAppear: и viewDidDisappear:.

Мои методы alloc / init для viewcontrollers обычно довольно пусты или даже не существуют.

...