освободить viewcontroller после модального представления - PullRequest
0 голосов
/ 16 мая 2010

Я смотрел CS193P Стэнфордский курс на Itunes, и на одной из лекций была дана демонстрация и Там было сказано, что вы можете представить viewcontroller модально, а затем выпустить его. Примерно так (я знаю, что это не идеально, но я нахожусь на моем ПК)

[self.view presentcontentmodally:myVC]
[myVC release];

Однако, похоже, это создает проблемы. Если я поставлю NSLog(@"%d", [myVC retainCount]) между этими двумя строками, то получится 2, что означает, что все в порядке. Однако, когда я отклоняю myVC, приложение вылетает. Ничто в NSlog и отладчике не покажет, где он остановился.

Но я использовал malloc-history или что-то, что, как сказал какой-то блог, поможет. И обнаружил, что это был myVC.

Так я должен выпустить мой ВК?

(также, когда modalVC был закрыт, следует ли использовать память приложения до появления modalVC?)

Ответы [ 2 ]

0 голосов
/ 16 мая 2010

Я только что проверил пару своих приложений и без проблем выпускаю свои контроллеры модального представления после каждой презентации. Что заставляет меня думать, что вы еще не понимаете модель управления памятью Какао. Вот образец:

TweetController *tweetController = [[TweetController alloc] init];
tweetController.content = content;
tweetController.delegate = self;
[self presentModalViewController:tweetController animated:YES];
[tweetController release];

Обратите внимание, что этот контроллер был создан с помощью alloc / init и ранее не выпускался и не выпускался автоматически.

Кроме того, пожалуйста, не полагайтесь на сохранение счета; сохранение может быть из предыдущего автоматического освобождения, которое очень скоро исчезнет, ​​вызывая вид ошибки, которую вы видели.

0 голосов
/ 16 мая 2010

Да, вы должны освободить свой контроллер вида после передачи его модальному навигационному контроллеру. Просто убедитесь, что вы не передаете ранее сохраненный контроллер представления, если не планируете управлять его выпуском вручную.

Например, следуйте продолжительности жизни _myViewController здесь:

MyViewController *_myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
UINavigationController *_modalNavigationController = [[UINavigationController alloc] initWithRootViewController:_myViewController];
[_myViewController release], _myViewController = nil; 
[[self navigationController] presentModalViewController:_modalNavigationController animated:YES];
[_modalNavigationController release], _modalNavigationController = nil;

Модальный навигационный контроллер будет увеличивать счет удержания на _myViewController, фактически приобретая его.

Как только модальный навигационный контроллер уволен и вы вернетесь к своему первоначальному навигационному контроллеру, модальный навигационный контроллер получит сообщение release и, в свою очередь, release его корневой контроллер вида (_myViewController).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...