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