Освобождение объектов при использовании UINavigationController

StackOverflow https://stackoverflow.com/questions/401389

  •  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, но что-то где-то не так, поскольку контроллер навигации сохраняет ваш контроллер просмотра, и вы должны убедиться, что вы освободили его после нажатия кнопки (если вы выделили экземпляр контроллера просмотра, как вы сделали в своем коде).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top