Цель C путаница - установка синтетических переменных в ivars - PullRequest
2 голосов
/ 17 сентября 2009

Я заметил, что в некоторых примерах я установил для движка (переменной класса) _engine (ivar). Я не понимаю Что здесь происходит?

Вот пример того, что я говорю: @synthesize engine = _engine, делегат = _delegate

Ответы [ 4 ]

9 голосов
/ 17 сентября 2009

Этот синтаксис отображает свойство в переменную экземпляра (ivar) с другим именем.

Итак:

@synthesize engine = _engine;

создаст методы доступа к свойствам, которые обращаются к _engine ivar вместо engine . Вы по-прежнему можете получить доступ к собственности как:

object.engine

Дополнительная информация содержится в документации разработчика Apple по свойствам (раздел Директивы реализации свойств )

4 голосов
/ 17 сентября 2009

Автор хотел убедиться, что не было путаницы между прямым доступом к ивару и доступом через установщик / получатель. Если имена совпадают, то в обычном случае это легко написать: engine = 0 вместо self.engine = 0; Для ивара, который необходимо сохранить, например, NSString, это может привести к ошибкам в счетчиках хранения.

Существует также исторический приоритет присвоения имен иварам с ведущими символами "_", "m" или "f", поэтому они будут легко распознаваться как ивары.

3 голосов
/ 18 сентября 2009

Ключевое слово @ synthezise указывает компилятору Objective-C на создание метода get и метода set для вашего свойства. Если вы определили:

@property(copy,nonatomic) NSString* name;

Тогда @synthesize name; создаст для вас эти два метода, чтобы вам не приходилось их реализовывать:

-(NSString*)name;
{
  return name;
}
-(void)setName:(NSString*)newName;
{
  if (name != newName) {
    [name release];
    name = [newValue copy];
  }
}

По умолчанию имя переменной экземпляра, которая используется в качестве резервного хранилища для синтезированного свойства, называется таким же, как и свойство. Это не всегда то, что вы хотите, и вы можете затем синтезировать как @synthesize name = _otherName;, чтобы сказать компилятору вместо этого сгенерировать этот код для вас:

-(NSString*)name;
{
  return _otherName;
}
-(void)setName:(NSString*)newName;
{
  if (_otherName != newName) {
    [_otherName release];
    _otherName = [newValue copy];
  }
}

Причина, по которой вы обычно добавляете префиксы переменных экземпляра, которые используются в качестве резервных хранилищ для свойств с символом подчеркивания '_', заключается в том, что вы помните, что не должны обращаться к ним напрямую.

0 голосов
/ 17 сентября 2009

Если имя ивара не совсем совпадает с именем синтезированного var, то вам необходимо сопоставить ivar с var. Возможно, вы захотите сделать это, если вам нравится ставить префикс в конце своего знака подчеркивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...