Доступ к ivars с помощью. обозначение

Предполагая, что у меня есть следующий класс.

@interface MyObj : NSObject{
   int age;   
}

-(void) setAge: (int) anAge;
-(int) returnAge;
@end

@implementation MyObj

-(void) setAge:(int) anAge{
  age = anAge;
}

-(int) returnAge{
  return age;
}

Если я затем хочу присвоить значение переменной age, я мог бы использовать метод class, чтобы сделать следующее в main.

MyObj *newObj = [MyObj new];
[newObj setAge:18];

Однако из-за того, что я возился, я заметил, что, похоже, я могу получить прямой доступ к ивару с помощью. нотации. Я не получаю предупреждения или ошибки с этим.

MyObj *newObj = [MyObj new];
newObj.age = 20;

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

Должен ли я использовать геттеры и сеттеры для всех иваров, или это прямой доступ к ним?

Спасибо

1 ответ

Я лично избегаю объявления переменных экземпляра и прямого доступа к ним. Вместо этого я объявляю только свойства, используя @property заявление. Последние компиляторы target-c автоматически вводят принадлежащие им переменные экземпляра (автоматический синтез). Кроме того, методы получения и установки добавляются автоматически, если только вы не объявите такие свойства как только для чтения или только для записи.

Используя свойства, я никогда не обращаюсь непосредственно к переменным экземпляра, за исключением случаев, когда реализую:

  • init методы их содержащего класса
  • при перезаписи методов получения / установки для получения / сохранения нового значения
  • dealloc методы

Во всех других местах я обращаюсь к собственности, используя self.propertyName нотации. Это неявно вызовет метод get и set свойства. Это имеет то преимущество, что вы можете представить методы get и set в более поздний момент, не изменяя существующий код.

Есть несколько хороших руководств по стилю, которые могут рассказать вам больше о хорошем стиле кода target-c, таких как:

Другие вопросы по тегам