В чем разница между @property и @synthesize?
-
03-07-2019 - |
Вопрос
Насколько я понимаю, @synthesize на самом деле генерирует геттеры и сеттеры.Но что тогда делает @property?Это просто настройка параметров для этой классной волшебной функции @synthesize?
Решение
Вы пишете @property в заголовочном файле
@property float value;
эквивалентно:
- (float)value;
- (void)setValue:(float)newValue;
Он получает информацию для ДРУГИХ классов о том, что ваш класс имеет эти методы
@synthesize физически СОЗДАЕТ эти методы в реализации класса
Другие советы
@property
объявляет имя как свойство.Это означает, что он будет доступен через точечный синтаксис (object.value
).
@synthetize
можно рассматривать как макрос, который создает методы getter и setter.Полезно знать, что вы можете переопределить эти методы, даже если вы вводите @synthetize
на месте.
@property
объявляет получатель и / или установщик
@synthesize
реализует их.
Существует распространенное заблуждение, что директива @synthesize требуется для реализации установщиков и геттеров, созданных с помощью директивы @property, но это не так.Использование директивы @property без @synthesize по-прежнему будет генерировать установщики / геттеры и позволит вам использовать точечную нотацию.Однако исключение директивы @synthesize приведет к тому, что компилятор сгенерирует соответствующие переменные экземпляра с начальным символом подчеркивания, напримерсвойство myVar будет иметь переменную экземпляра _myVar.
Использование символа подчеркивания в начале является распространенным соглашением, которое позволяет вам проводить различие между свойствами и переменными экземпляра.Также часто свойства и переменные экземпляра имеют одно и то же имя, что и @synthesize делает по умолчанию.