2015-03-20 3 views
0

Я нашел этот код, и я был ошеломлен:Objective-C: Instance переменного и свойство с таким же именем

@interface MyNode : NSObject { 
    Node *node; 
} 

@property(nonatomic,strong) Node *node; 

@end 

Что такое поведение этого кода?
Я думаю, что объявление свойства «узла» ovveride теневой предыдущей декларации, не так ли?

+0

Где находится "глобальная переменная", которую вы упоминаете? Существует переменная экземпляра и свойство. – gnasher729

+0

Вы правы, обновлены! –

ответ

1

Поведение вашего кода заключается в том, что вы объявили свойство и переменную экземпляра. @property(nonatomic,strong) Node *node; будет иметь переменную экземпляра _node, автоматически синтезированную компилятором (это было введено в Xcode 4.4).

Поэтому у вашего класса теперь есть переменная экземпляра и _node.

Возможно, если вы прочитаете documentation, тогда вы не будете так ошеломлены, когда столкнетесь с конструкциями языка программирования!

+0

Да, я понимаю. Но если я объявляю переменную экземпляра с именем «_node», программа компиляции в любом случае !! Зачем? –

+0

В этом случае компилятору не нужно автоматически генерировать переменную экземпляра «_node», поскольку вы явно объявили ее. Когда компилятор автоматически генерирует строку «@synthesize node = _node», он будет использовать переменную экземпляра, которую вы явно объявили. – OpenUserX03

+0

@ OpenUserX03 Я ошеломлен о краткой, четкой документации, которую вы упомянули. – Liviu

1

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

Вы никогда не должны иметь переменную экземпляра, которая не начинается с символа подчеркивания. Вместо этого сделайте Node * _node. Теперь вам больше не о чем беспокоиться. Вся проблема ушла.

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

+2

Как насчет автосинтеза собственности. Высказывание никогда не является строгим. И сказать, что вам не нужно беспокоиться об этом, не объясняет, почему нет. – Wain

Смежные вопросы