Пользовательские побочные эффекты геттера - PullRequest
2 голосов
/ 29 июня 2010

Есть ли побочные эффекты при вызове пользовательского геттера с точечной нотацией?

Я использовал синтезированный геттер в Objective-C через точечную запись, т.е.

tree.fruitnumber

вернул количество плодов в дереве. Мне пришлось настроить геттер (по причинам, не относящимся к этому вопросу). Я написал это как

-(int) fruitnumber
{
   //climb into tree and hand count fruits. Get n;
   return n;
}

Удивительно, но пунктирный геттер все еще работает. Это законно, или есть неприятная ошибка (которая заразит все мои фрукты в будущем (на рынок?)).

Ответы [ 6 ]

6 голосов
/ 29 июня 2010

Точечная запись на самом деле просто синтаксический сахар для скобочной записи. Итак, оба сообщения одинаковы:

int x = [self fruitNumber];
int x = self.fruitNumber;

Приятно то, что вы можете @synthesize свои свойства и методы setter / getter будут созданы для вас (конечно, в зависимости от ваших свойств), но вы можете написать свои собственные, и они будут использоваться. 1005 *

В случае, если вы предоставляете свои собственные методы установки / получения, вы можете альтернативно использовать строку @dynamic propertyName вместо @synthesize, чтобы сообщить компилятору, что они предоставляются вами.

4 голосов
/ 29 июня 2010

Есть некоторые побочные эффекты, о которых никто не упомянул:

  • Атомность - если вы не объявляете свойство как nonatomic, то (по умолчанию) это атомарное свойство, котороеозначает, что значение свойства будет полностью извлечено независимо от того, что другие потоки могут делать для изменения свойства одновременно.Если у вас есть атомарное свойство, а затем переопределяете геттер или сеттер, вы теряете атомарность (если вы не реализуете его самостоятельно).
  • Наблюдение ключ-значение - используя методы @synthesized, вы гарантируете соответствие KVO, что позволяет очень легко наблюдать значения объекта по мере их изменения (и получать уведомления о таких изменениях).Если вы переопределите синтезированные методы, вы рискуете нарушить это соответствие.

Таким образом, обычно безопасно переопределить синтезированные методы получения и установки, но есть предостережения , и это очень важно, чтобы вы понимали, что это такое, чтобы, если / когда что-то сломалось, вы знали, почему.

3 голосов
/ 29 июня 2010

Вы можете указать пользовательский метод получения при объявлении свойства, например:

@property (readwrite, getter=numberOfFruitsCountedByTheCustomGetter) int fruitnumber;

В своей реализации синтезируйте его как обычно:

@synthesize fruitnumber;

Затем реализуйте метод получения:

- (int) numberOfFruitsCountedByTheCustomGetter {
    return fruitnumber;
}
2 голосов
/ 29 июня 2010

Неважно, пишете ли вы геттер или он синтезируется, он вызывается, когда вы используете точечную нотацию (или скобочную нотацию).Это способ, которым он должен работать.

1 голос
/ 29 июня 2010

Точечная запись - это просто сокращение для вызова метода получения или установки.Нет разницы в том, как это выглядит.

Обычный побочный эффект, используемый в геттерах, - это ленивый геттер.

-(id) something {
  if ( nil == something ) {
    something = ...;
  }
  return something;
}

Геттер не обязательно должен быть связан с конкретным членомОн может вернуть результат вычисления или поиска или передать что-либо из объекта-члена.

0 голосов
/ 29 июня 2010

Progrmr правильно. Однако я бы хотел добавить объявление @dynamic, чтобы явно сообщить компилятору, что вы создаете геттер. Вот ссылка на документацию по свойствам. Это имеет смысл, если у вас был шанс.

http://developer.apple.com/mac/library/iPad/index.html#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html

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