Как мне управлять памятью UIViewControllers с помощью контроллера навигации? - PullRequest
6 голосов
/ 30 октября 2008

Так что да, я парень из Java в этом безумном мире iPhone. Когда дело доходит до управления памятью, я не очень хорошо представляю, что я делаю.

У меня есть приложение, которое использует контроллер навигации, и когда пришло время перейти к следующему представлению, у меня есть код, который выглядит следующим образом:

UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView" 
                                                                    bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];

Теперь согласно основному правилу Apple по управлению памятью

Вы становитесь владельцем объекта, если создаете его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy), или если вы отправите ему сообщение retain. Вы несете ответственность за отказ от владения принадлежащими вам объектами, используя release или autorelease. В любое другое время, когда вы получаете объект, вы не должны отпускать его.

Для меня это означает, что я должен выпустить myController или дать ему сообщение autorelease. Но всякий раз, когда я пытаюсь это сделать, мое приложение перестает работать, когда я выталкиваю и выталкиваю представления из стека.

Это не пахло мне, но при запуске Instruments утверждается, что у меня нет утечек памяти.

Итак, мой вопрос

  1. Я правильно делаю?
  2. Является ли Navigation Controller владельцем MyViewController, объясняя отсутствие утечки памяти?
  3. Должен ли я назначить myController переменной экземпляра в моем корневом ViewController? В этом случае он будет помечен как retain, и я получу в методе dealloc рута

Ответы [ 2 ]

9 голосов
/ 30 октября 2008

Проблема в том, что (скорее всего) вы выпускаете свой viewController до , когда у контроллера навигации есть шанс претендовать на право собственности. Есть два способа обойти это:

  • -release ваш контроллер после нажатия на Nav Controller
  • -autorelease ваш контроллер до того, как нажмет его. Если вы сделаете это, активный NSAutoreleasePool (о котором вам не нужно беспокоиться) позаботится об освобождении вашего контроллера в более позднее время.
3 голосов
/ 31 октября 2008

@ Бен Готлиб, зачем вам нужно делать авто-релиз, прежде чем нажимать его? Число сохранений при выделении объекта равно 1, автоматическое освобождение до или после нажатия не влияет на количество сохраненных данных, хотя обычно автоматическое освобождение в зависимости от стиля применяется после объекта alloc / init:

[[[object alloc] init] autorelease];

@ bpapa,

2) При нажатии контроллер навигации сохранит контроллер вида. Позже, когда это представление удалено из стека навигационного контроллера, навигационный контроллер освободит его.

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

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