@synthesize за кадром

Когда мы создаем свойство и определяем для него синтез, компилятор автоматически создает методы получения и установки, верно?

Теперь, если я выполню эту команду:

@property(nonatomic) int value;

@synthesize value;

value = 50;

Что случается:

Компилятор сохраняет значение «50» в свойстве?

property (nonatomic) int value; // Here is the stored value 50!

или компилятор создает переменную за кулисами с таким же именем свойства, как это:

interface myClass: NSObject {
    int value; // Here is the stored value 50!
}

Что на самом деле происходит и какие альтернативы, перечисленные выше, верны?


person LettersBa    schedule 17.03.2015    source источник
comment
Я не понимаю, почему это создает переменную за кулисами, но на самом деле я понятия не имею. Почему вы спрашиваете?   -  person notadam    schedule 17.03.2015
comment
@adam10603 Adam10603 Я спрашивал об этом, потому что я начинаю узнавать о динамике, и, устанавливая динамическое свойство, вы должны делать это вручную, теперь, когда вы уже знаете, как работает синтез, у вас уже есть лучшее представление о том, как работает динамика.   -  person LettersBa    schedule 17.03.2015


Ответы (1)


Вероятно, это семантика, но @synthesize больше не требуется для свойств. Компилятор делает это автоматически.

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

@property (nonatomic, assign) NSInteger value;
// an instance variable NSInteger _value; will be created in the interface.

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

- (void)setValue:(NSInteger)value {
    _value = value;
    // custom code
}
person Jasarien    schedule 17.03.2015
comment
@property генерирует переменную экземпляра и методы установки и получения, а не мост. Когда вы обращаетесь к такому свойству, как object.property;, компилятор переводит его в [object property]; или object.property = value; в [object setProperty:value]; - это скорее синтаксический короткий путь, чем мост. - person Jasarien; 17.03.2015
comment
Чтобы расширить ваш ответ, вызов @synthesize может фактически установить имя ivar, например. @synthesize x = myX. Важно понимать, что свойство является сеттером и геттером, двумя методами. Свойство вообще не должно иметь ивар. - person Sulthan; 17.03.2015
comment
Это правда, и может быть сложно понять, какие случаи будут генерировать ивар, а какие нет. В этом ответе есть довольно хорошее резюме stackoverflow.com/questions/12933785/ - person Jasarien; 17.03.2015