Основной ответ таков: в примере кода должен быть только один [imgView release]
( независимо от того, идет ли он после addSubview или в dealloc ). Однако я бы удалил [imgView release]
из dealloc
и оставил бы его после addSubview
.
Есть ловушка на iPhone; с didReceiveMemoryWarning
вы можете получить объекты (, включая весь вид ), выпущенные из-под вас. Если у вас есть набор сохранения для всего приложения, и вы не уважаете память, вы можете обнаружить, что приложение просто уничтожается.
Хороший пример:
если вы думаете о вложенном наборе из 3 представлений, выберите Вид 1-> Вид 2-> Вид 3.
Далее рассмотрим вызовы 'viewDidLoad
' и 'viewDidUnload
'. Если пользователь в настоящее время находится в «Представлении 3», возможно, что View1 выгружен, и это то, где это становится неприятным.
Если вы разместили объект внутри viewDidLoad
и не освободили его после добавления его в подпредставление, то ваш объект не будет освобожден, когда view1 выгружен, но view1 все еще выгружен.
viewDidLoad
будет запущен снова, и ваш код будет запущен снова, но теперь у вас есть два экземпляра вашего объекта вместо одного; один объект будет находиться в нигде с ранее выгруженным видом, а новый объект будет для текущего видимого вида. Промойте, вспените и повторите, и вы обнаружите, что ваше приложение падает из-за утечек памяти.
В этом примере, если данный блок кода является энергозависимым и имеет шанс на повторное выполнение ( из-за памяти или незагруженного представления ), я бы удалил [imgView release];
из dealloc и оставил это после addSubView.
Вот ссылка на основные концепции сохранения / выпуска:
http://www.otierney.net/objective-c.html#retain