#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 напрямую, поэтому вам нужно
-
сохраните ваше изображение (или лучше фактически используйте свойство) — в противном случае ваш объект image будет уничтожен при выходе из текущей области, и доступ к нему другими методами приведет к ошибке. Поэтому используйте:
self.image = [UIImage imageNamed:@"image.png"];
-
Освободите ваше изображение методом 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;