Освобождение объектов при использовании UINavigationController
-
03-07-2019 - |
Вопрос
Я использую UINavigationController, и у меня возникают проблемы с освобождением объектов, когда я запускаю новое представление.Я хочу установить объект на новый контроллер, прежде чем нажимать на него.То, как я сейчас это делаю, таково:
OpenPageViewController *varOpenPageController = [[OpenPageViewController alloc] initWithNibName:@"OpenPageViewController" bundle:nil];
varOpenPageController.bookObj = bookObj;
[[self navigationController] pushViewController:varOpenPageController animated:YES];
//[varOpenPageController release];
Если я раскомментирую эту последнюю строку, то программа завершит работу при возврате к моему контроллеру.У меня также есть еще один вопрос относительно того, когда / как освободить объект.В bookObj у меня есть изменяемый массив объектов страницы, и я хочу изменить текст текущего объекта страницы.Я делаю это с помощью:
Page *pageObj = [[bookObj pagesArray] objectAtIndex:currentPage];
pageObj.page_Text = textView.text;
[[bookObj pagesArray] replaceObjectAtIndex:currentPage withObject:pageObj];
//[pageObj release];
Программа выйдет из строя, если я раскомментирую и эту последнюю строку.Это позволит мне двигаться вперед, но когда я возвращаюсь назад и снова пытаюсь двигаться вперед, происходит сбой.
Автоматическое обновление объектов приводит к аналогичным результатам.Пожалуйста, посоветуйте, если можете.Спасибо.
Редактировать:Когда я выпускаю первый пример varOpenPageController и запускаю симулятор с утечками, тогда программа, кажется, функционирует должным образом.Однако, если я не запускаю Утечки, это приводит к сбою.У кого-нибудь есть какие-нибудь идеи, почему это может произойти?Спасибо.
Решение
Возможно, стоит почитать Документ по управлению памятью Apple.Второй элемент вам не нужно освобождать pageObj, поскольку он содержит только ссылку на фактический элемент в массиве bookObj.Это не сам товар, если в этом есть смысл.Итак, что вы фактически делаете, это освобождаете фактический элемент из массива, поэтому, когда вы возвращаетесь и пытаетесь получить к нему доступ, его там нет.
Эмпирическое правило заключается в следующем:выпускайте только то, что вы создаете.
Другие советы
Ваш первый пример переноса контроллера представления на навигационный контроллер корректен с выпуском.Если при возврате происходит сбой, это, вероятно, означает, что у вас что-то не так в методе OpenPageViewController dealloc, но что-то где-то не так, поскольку контроллер навигации сохраняет ваш контроллер просмотра, и вы должны убедиться, что вы освободили его после нажатия кнопки (если вы выделили экземпляр контроллера просмотра, как вы сделали в своем коде).