Вы никогда не звоните -dealloc
напрямую. Единственное, что близко - это вызов [super dealloc]
, и он должен вызываться только на вашем dealloc
. Если вы позвоните dealloc
напрямую, вы должны ожидать сбоя позже.
Если вы хотели сказать [viewController release]
, то это означает, что у вас есть несоответствие где-то в удержаниях и выпусках. Вы должны выпустить то, что вы сохраняете. См. Три Волшебных Слова для более подробного объяснения и ссылок на полные документы. Они не сложны, но вы должны следовать им последовательно.
РЕДАКТИРОВАТЬ Если вы выделяете, вы должны отпустить, когда вы закончите с объектом. Это не означает «когда объект должен быть уничтожен». Это означает «когда вы покончили с объектом». Если другим частям системы все еще нужен объект, они сохранят его. Оставь, что хочешь, отпусти то, что ты сделал.
В вашем примере вы должны release
mapView
. Вы передали его контроллеру навигационной системы, и теперь все готово. Если вы терпите неудачу в выпуске этого, вы, вероятно, переиздаете в другом месте. Наиболее вероятным местом является один из иваров OnePlaceViewController
или один из иваров принадлежащего ему объекта.
Начните со статического анализатора (Cmd-Shift-B в Xcode 4), и посмотрите, не обнаружит ли он ваш перевыпуск. Это не делает хорошую работу по поиску перевыпусков Ивара, все же. Затем убедитесь, что вы всегда использование аксессоров за исключением init
и dealloc
(и init
спорно). Непосредственный доступ к вашим ivars - это причина № 1 неправильного управления памятью, которая является причиной № 1 сбоев.
Не просто случайным образом вставляйте и удаляйте удержания и выпуски. Вы будете связывать себя в узлах. Если вы исправите сбои, вы будете течь. Когда вы исправите утечки, вы потерпите крах. Вы должны найти ошибку и исправить ее. Обходного пути нет, пока вы не обновитесь до системы, включающей ARC (после чего все это волшебным образом исчезнет ...)