Должен ли я выпустить UIImageView, добавленный в мое представление, если я обнаружу касание его позже? - PullRequest
0 голосов
/ 07 февраля 2011

Я узнал, что если вы создаете объект, вы им владеете, и вам нужно освободить его, когда вы закончите с ним.В этом случае я создаю UIImageView и добавляю его в свой вид следующим образом:

myImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
[myImageView setFrame:CGRectMake(10,10,100,100)];
[self.view addSubview:myImageView]; 
[myImageView release];

Если позже я захочу обнаружить прикосновение к myImageView в моем методе touchEnded:1006 * Это работает, но верно ли это, поскольку я теперь использовал myImageView после его выпуска?И как мне выпустить myImageView из self.view, к которому я его добавил ранее?

Ответы [ 5 ]

1 голос
/ 07 февраля 2011

Пока ваш объект myUIImageView имеет счет сохранения> 0, он все еще будет существовать, и вы сможете продолжать его использовать. Когда вы впервые добавляете его в качестве подпредставления, он получает сообщение о сохранении, поэтому вероятность его сохранения составляет 2. Затем вы отправляете его релиз, поэтому его количество хранения уменьшается до 1. Это означает, что он все еще существует в памяти. Теперь, если вы отправите релиз еще раз или отправите removeFromSuperView, то его счет удержания будет равен нулю, и вы потеряете его.

1 голос
/ 07 февраля 2011

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

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

Apple стала более последовательной в iOS, переключив свои рекомендации на IBOutlets. На Mac вы не сохраняете свои IBOutlets, но в iOS Apple прямо предписывает вам сделать это. Это похоже на ситуацию, которую вы обсуждаете, и я согласен с движением Apple в направлении более безопасного подхода.

0 голосов
/ 07 февраля 2011

Если вам нужно получить доступ к вашему UIImage в какой-то момент в будущем, вам необходимо сохранить его.

То, как вы это делаете, остается на ваше усмотрение, но вы должны не полагаться на UIView, чтобы переобучить ваши объекты для вас. Ситуация, которую вы создали, сейчас работает, но она хрупкая.

0 голосов
/ 07 февраля 2011

Предполагая, что myUIImageView является иваром вашего пользовательского подкласса UIView, ваш код будет работать до тех пор, пока представление вашего изображения остается в его суперпредставлении. Экземпляр представления изображения может быть освобожден, и вы можете получить недействительный указатель, ссылающийся на освобожденный объект. В лучшем случае вы терпите крах.

В соответствии с рекомендациями по управлению памятью, вы должны рассматривать ваше представление изображения <-> пользовательское отношение подкласса uiview как более влажное:

  • сильная ссылка. Вы являетесь владельцем изображения (как вы его создали) и несете ответственность за его сохранение / публикацию
  • слабая ссылка. Вы не являетесь владельцем объекта, поэтому хранить ссылку на него может быть опасно.

в вашем случае, это, вероятно, сильная ссылка. ваш myUIImageView ivar должен быть неатомарным сохраненным свойством вашего объекта.

0 голосов
/ 07 февраля 2011

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

Если вы хотите использовать эту переменную для указания на ваше изображение, сохраните ivar (с помощью retain имущество).Таким образом, вы гарантируете, что представление изображения доступно для вашего класса контроллера для использования.

...