Освобождение собственности (Objective-C) - PullRequest
2 голосов
/ 09 мая 2009

У меня есть @property, который определяется следующим образом:

@ имя свойства (неатомное, сохраняемое);

В функции я анализирую некоторые xml и устанавливаю свойство name. У меня вопрос: нужно ли явно освобождать предыдущий сохраненный экземпляр перед сохранением нового?

Например:

myObj.name = [otherObj getName]; // сохранить счет + 1

..

myObj.name = [otherObj getName]; // какой новый экземпляр имени, выпущено ли предыдущее имя?

Ответы [ 2 ]

4 голосов
/ 09 мая 2009

В установщике синтезированного свойства код выполняет нечто примерно аналогичное этому (у нас будет name имя свойства, а _name будет переменная экземпляра, к которой оно относится):

- (void) setName: (NSString *) newValue
{
  if ( newValue == _name )
    return;

  [newValue retain];
  [_name release];
  _name = newValue;
}

Теперь, это показывает, что произойдет на основе вашего объявления о недвижимости выше. В зависимости от других возможных атрибутов этого свойства, эта функция будет либо использовать [newValue copy] вместо [newValue retain] (если указан атрибут «copy»), либо все будет заключено в блок @synchronized(self) (если атрибут nonatomic 'был НЕ предоставлен).

Я должен также отметить, что, поскольку ваше свойство относится к NSString, который реализует протокол NSCopying, вам действительно следует использовать копию, а не сохранять, т.е.

@property (nonatomic, copy) NSString * name;

Это заставит синтезированный установщик использовать -copy вместо -retain, что безопаснее, когда вы фактически передаете объект NSMutableString. Неизменяемая строка в конечном итоге будет сохранена только при вызове -copy, а изменяемая строка создаст новую неизменяемую копию. Невыполнение этого означает, что сама строка может быть изменена после того, как она была передана в установщик, изменяя значение без ведома вашего объекта.

3 голосов
/ 09 мая 2009

Если вы синтезировали средства доступа для вашей собственности (с директивой @synthesize), они позаботятся об освобождении ивара, который поддерживает свойство, когда свойство будет переназначено. Единственный раз, когда вы захотите явно освободить ivar, это когда ваш объект освобождается. Итак, ваш метод dealloc может выглядеть так:

- (void)dealloc {
  [name release];
  // other cleanup here
  [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...