Так что да, я парень из 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 утверждается, что у меня нет утечек памяти.
Итак, мой вопрос
- Я правильно делаю?
- Является ли Navigation Controller владельцем MyViewController, объясняя отсутствие утечки памяти?
- Должен ли я назначить myController переменной экземпляра в моем корневом ViewController? В этом случае он будет помечен как retain, и я получу в методе dealloc рута