Доступ к 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, таких как: