Синтезируем переменные из свойств?

#iphone #objective-c #cocoa-touch

#iPhone #objective-c #cocoa-touch

Вопрос:

Могу ли я просто проверить, что происходит, когда вы делаете следующее (см. Ниже), я прав, думая, что никакие IVARS не создаются в «ИНТЕРФЕЙСЕ» только с тремя свойствами. В «РЕАЛИЗАЦИИ» эти три свойства присваиваются иварам с именами _window , _animationTimer amp; _currentFrame , которые создаются @synthesize командой?

 // INTERFACE
@interface testDelegate : NSObject ... {
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, assign) NSTimer *animationTimer;
@property (nonatomic, assign) int currentFrame;
...
  

.

 // IMPLEMENTATION
@implementation testDelegate
@synthesize window = _window;
@synthesize animationTimer = _animationTimer;
@synthesize currentFrame = _currentFrame;
...
  

Ответ №1:

Да, именно так это работает. @synthesize теперь можно автоматически генерировать соответствующие переменные экземпляра, а также средства доступа к ним. Это относительно недавняя разработка в языке.

Комментарии:

1. Добавим к этому, что если бы вы только что сделали @synthesize propertyName , это создало бы переменные экземпляра с теми же именами, что и свойства, по-прежнему не нужно их нигде объявлять.

2. Скажем, я бы создал @property (nonatomic, assign, readonly) BOOL isValid; без синтеза, но внедрив средство получения. Увеличит ли это размер каждого экземпляра класса?

3. @Jenox: Нет, это было бы не так. Ни свойства (как таковые), ни методы не влияют на размер экземпляров.

4. Хорошо, спасибо. Просто чтобы убедиться, что я правильно понял это, еще один вопрос: если я хотел бы иметь свойство ivar с пользовательскими способами получения и установки, мне все равно нужно было бы синтезировать его, чтобы создать ivar, правильно?

5. @Jenox: Это, или вы могли бы просто объявить ivar.