Следует ли освобождать эту переменную вручную?

#iphone #objective-c

#iPhone #objective-c

Вопрос:

Память необходимо освободить для выделения, сохранения и копирования. Мой вопрос касается следующей ситуации, когда я сохраняю свойство UIImage, но оно было автоматически выпущено функцией imagedNamed. Должен ли я по-прежнему выпускать следующую переменную?

 @property (nonatomic, retain) UIImage *image;
self.image = [UIImage imageNamed:@"image.png"];
  

Спасибо!

Комментарии:

1. Я предполагаю, что вы отредактировали это, чтобы устранить проблему. Теперь приведенные ниже ответы не имеют смысла. Это затрудняет отслеживание и изучение другими людьми. Был ли ваш исходный код таким? [self image] = [UIImage imageNamed:@"image.png"];

Ответ №1:

В вашем коде вы не используете свое свойство, а присваиваете автоматически выпущенный объект UIImage вашему iVar напрямую, поэтому вам нужно

  1. сохраните ваше изображение (или лучше фактически используйте свойство) — в противном случае ваш объект image будет уничтожен при выходе из текущей области, и доступ к нему другими методами приведет к ошибке. Поэтому используйте:

     self.image = [UIImage imageNamed:@"image.png"];
      
  2. Освободите ваше изображение методом dealloc

Комментарии:

1. Извините. Ошибочно введите self.image.

Ответ №2:

Да, вы должны освободить изображение, поскольку вы его сохранили.

Комментарии:

1. Но он обращается к ivar, а не к свойству. Таким образом, retain не вызывается.

2. Правильно. это объект автоматического освобождения. Вам нужно беспокоиться об освобождении только тех объектов, которые вы либо выделяете, либо сохраняете. В вашем примере, если вы скажете self.image = [UIImage imageNamed:@»image.png»]; тогда оно будет сохранено, поскольку будет получен доступ к его свойству. Если вы не указываете self.image, как в вашем примере, вы ее не сохраняете.

3. Все еще нужно выполнить self.image = nil и [выпуск изображения]. Все сохраненные свойства должны быть освобождены при освобождении.

4. @jini: Нет необходимости делать и self.image = nil , и [image release] в dealloc. Первое сделает второе неактуальным.

5. Да, но если вы это сделаете, self.image = nil то image значение равно нулю. [nil release] абсолютно ничего не делает. Таким образом, выполнение self.image = nil; [image release]; точно такое же, как self.image = nil;