В установщике синтезированного свойства код выполняет нечто примерно аналогичное этому (у нас будет 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
, а изменяемая строка создаст новую неизменяемую копию. Невыполнение этого означает, что сама строка может быть изменена после того, как она была передана в установщик, изменяя значение без ведома вашего объекта.