Освобождение объектов при использовании UINavigationController - PullRequest
1 голос
/ 30 декабря 2008

Я использую UINavigationController и у меня возникают проблемы с освобождением объектов при открытии нового представления. Я хочу установить объект на новый контроллер, прежде чем нажать его. То, как я сейчас делаю это:

OpenPageViewController *varOpenPageController = [[OpenPageViewController alloc] initWithNibName:@"OpenPageViewController" bundle:nil];
varOpenPageController.bookObj = bookObj;
[[self navigationController] pushViewController:varOpenPageController animated:YES];
//[varOpenPageController release];

Если я раскомментирую эту последнюю строку, то программа вылетает, когда я возвращаюсь назад по всему контроллеру. У меня также есть другой вопрос относительно того, когда / как освободить объект. В bookObj у меня есть изменяемый массив объектов Page, и я хочу изменить текст текущего объекта страницы. Я делаю это по:

Page *pageObj = [[bookObj pagesArray] objectAtIndex:currentPage];
pageObj.page_Text = textView.text;
[[bookObj pagesArray] replaceObjectAtIndex:currentPage withObject:pageObj];
//[pageObj release];

Программа вылетает, если я также раскомментирую эту последнюю строку. Это позволит мне двигаться вперед, но когда я вернусь назад и попытаюсь идти вперед, произойдет сбой.

Автоматическое освобождение объектов дает аналогичные результаты. Пожалуйста, сообщите, если можете. Спасибо.

РЕДАКТИРОВАТЬ: Когда я выпускаю первый пример varOpenPageController и запускаю симулятор с утечками, программа, кажется, работает правильно. Тем не менее, если я не запускаю Leaks, то происходит сбой. У кого-нибудь есть идеи, почему это может произойти? Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 декабря 2008

Ваш первый пример нажатия контроллера вида на контроллер навигации правильный с выпуском. Если это происходит сбой, когда вы вернетесь, это, вероятно, означает, что у вас что-то не так в методе OpenlocageController dealloc, но где-то что-то не так, поскольку контроллер навигации сохраняет ваш контроллер представления, и вы должны убедиться, что вы отпустите его после нажатия (если у вас есть выделил экземпляр контроллера представления, как вы это делали в своем коде).

2 голосов
/ 30 декабря 2008

Возможно, стоит прочитать Документ по управлению памятью Apple . Второй элемент вам не нужно освобождать pageObj, поскольку он содержит только ссылку на фактический элемент в массиве bookObj. Это не факт, если это имеет смысл. То, что вы фактически делаете, это освобождает фактический элемент из массива, поэтому, когда вы возвращаетесь и пытаетесь получить к нему доступ, его там нет.

Практическое правило гласит: только отпускай то, что создаешь.

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