Когда установка свойства Objective C сохраняется дважды? - PullRequest
4 голосов
/ 13 февраля 2010

С учетом следующего кода

@interface MyClass
{
   SomeObject* o;
}

@property (nonatomic, retain) SomeObject* o;

@implementation MyClass
@synthesize o;

- (id)initWithSomeObject:(SomeObject*)s
{
   if (self = [super init])
   {
      o = [s retain]; // WHAT DOES THIS DO? Double retain??
   }
   return self
}

@end

1 Ответ

12 голосов
/ 13 февраля 2010

Это не двойное удержание; s сохраняется только один раз.

Причина в том, что вы не вызываете метод синтезатора в вашем инициализаторе. Эта строка:

o = [s retain];

сохраняет s и устанавливает o равным s; то есть o и s указывают на один и тот же объект. Синтезированный метод доступа никогда не вызывается; Вы можете полностью избавиться от линий @property и @synthesize.

Если бы эта строка была:

self.o = [s retain];

или эквивалентно

[self setO:[s retain]];

тогда будет вызван синтезированный метод доступа, который сохранит значение во второй раз. Обратите внимание, что обычно не рекомендуется использовать методы доступа в инициализаторах, поэтому o = [s retain]; является наиболее распространенным использованием при кодировании функции init.

...