Основное управление памятью: вызов [super dealloc] в методе dealloc - PullRequest
1 голос
/ 12 августа 2011

Если у меня есть стек представлений, управляемый контроллером представления, и когда я извлекаю представление из стека представлений, вызывается метод dealloc (содержащий [super dealloc]), означает ли это, что мне не нужно освобождать посмотреть контроллер, где он был создан?

Я спрашиваю, потому что я первоначально выпускал представления после создания и отправлял их в контроллер навигации, за исключением того, что я постоянно получаю «переизданные» ошибки, когда я включаю [viewController release]. Без этого утверждения контроллер навигации работает нормально, а функция анализа в XCode не жалуется на потенциальную утечку памяти.

Любое объяснение будет с благодарностью!

Редактировать: пример того, где это происходит

 OnePlaceViewController *mapView = [[OnePlaceViewController alloc] initWithNibName:nil bundle:nil];

[self.navigationController pushViewController:mapView animated:YES];

Обычно я звонил бы [mapView release] после того, как нажимаю на контроллер навигации (в любом случае, в моем понимании управления памятью), но позже в моем приложении происходит сбой, если я сохраню линию там.

Ответы [ 3 ]

1 голос
/ 12 августа 2011

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

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

Во-вторых, вы никогда не должны вызывать [anObject dealloc] напрямую. Исключение составляет [super dealloc] внутри метода dealloc. Вы будете использовать release и autorelease, когда соответствует.

Опять же, следуйте правилам управления памятью от Apple, и у вас все будет хорошо

1 голос
/ 12 августа 2011

Пара вещей:

1) Вы всегда должны release после установки контроллера вида на контроллер навигации или любой другой контроллер вида «контейнер», так как эти контроллеры будут retain на видеконтроллер вы просто alloc ред.Исключение составляют случаи, когда вы хотите сохранить контроллер представления в ivar для дальнейшего использования, и в этом случае вы должны сохранить его.В этом случае вы, вероятно, получаете перевыпущенный сбой, потому что что-то в вашем методе OnePlaceViewController dealloc перевыпущено.Проверьте этот метод для объектов, на которых вы не сохранили.

2) Будьте осторожны при использовании слов «view» и «view controller».Представление - это абстракция пространства для рисования, а контроллер представления - это объект, который содержит логику для управления представлением.Если вы используете IB и выделяете контроллер представления через перо (которое вам кажется), тогда все управление памятью представления для этого контроллера представления должно обрабатываться автоматически.Я бы внимательно посмотрел на любые объекты, которые вы используете, кроме представления в OnePlaceViewController, чтобы увидеть, будет ли что-либо выпущено дважды.

1 голос
/ 12 августа 2011

Вы никогда не звоните -dealloc напрямую. Единственное, что близко - это вызов [super dealloc], и он должен вызываться только на вашем dealloc. Если вы позвоните dealloc напрямую, вы должны ожидать сбоя позже.

Если вы хотели сказать [viewController release], то это означает, что у вас есть несоответствие где-то в удержаниях и выпусках. Вы должны выпустить то, что вы сохраняете. См. Три Волшебных Слова для более подробного объяснения и ссылок на полные документы. Они не сложны, но вы должны следовать им последовательно.

РЕДАКТИРОВАТЬ Если вы выделяете, вы должны отпустить, когда вы закончите с объектом. Это не означает «когда объект должен быть уничтожен». Это означает «когда вы покончили с объектом». Если другим частям системы все еще нужен объект, они сохранят его. Оставь, что хочешь, отпусти то, что ты сделал.

В вашем примере вы должны release mapView. Вы передали его контроллеру навигационной системы, и теперь все готово. Если вы терпите неудачу в выпуске этого, вы, вероятно, переиздаете в другом месте. Наиболее вероятным местом является один из иваров OnePlaceViewController или один из иваров принадлежащего ему объекта.

Начните со статического анализатора (Cmd-Shift-B в Xcode 4), и посмотрите, не обнаружит ли он ваш перевыпуск. Это не делает хорошую работу по поиску перевыпусков Ивара, все же. Затем убедитесь, что вы всегда использование аксессоров за исключением init и deallocinit спорно). Непосредственный доступ к вашим ivars - это причина № 1 неправильного управления памятью, которая является причиной № 1 сбоев.

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

...