Автозапуск затем сохранить для сеттеров - PullRequest
2 голосов
/ 22 января 2011

Согласно Руководству по стилю Google Objective-C , мы должны выполнить автоматическое восстановление, а затем сохранить его так:

- (void)setFoo:(GMFoo *)aFoo {
  [foo_ autorelease];  // Won't dealloc if |foo_| == |aFoo|
  foo_ = [aFoo retain];
}

В этом случае, foo_ не будет освобожден, если задан тот же экземпляр, что делает его более защищенным для установки.

У меня вопрос: как работает @property & @synthesize?

1 Ответ

4 голосов
/ 22 января 2011
Релиз

из-за автоматического выпуска не вызывается до конца текущего цикла выполнения, поэтому foo_ wont dealloc, потому что сначала вызывается retain, а затем выпуск в конце текущего цикла выполнения. Однако, это не то, как работает код, сгенерированный в @synthesize. Это работает больше как

- (void)setFoo:(GMFoo *)aFoo {
   if (aFoo != foo_) {
      [aFoo retain];
      [foo_ release];
      foo_ = aFoo;
   } 
}

Этот метод сохраняет циклы процессора, когда не требуется никаких изменений, и устраняет небольшие накладные расходы при использовании пула автоматического выпуска.

...