Подтвердить что ты не робот

Разница между свойствами и переменными в заголовочном файле iOS?

Возможный дубликат:
Есть ли разница между "переменной экземпляра" и "свойством" в Objective-c?
Разница между self.ivar и ivar?

В чем разница между объявлением переменных в скобках сразу после строки @interface и определением свойств ниже?

Например...

@interface GCTurnBasedMatchHelper : NSObject {
BOOL gameCenterAvailable;
BOOL userAuthenticated;
}

@property (assign, readonly) BOOL gameCenterAvailable;
4b9b3361

Ответ 1

Определение переменных в скобках просто объявляет их переменными экземпляра.

Объявление (и синтезация) свойства генерирует геттеры и сеттеры для переменной экземпляра в соответствии с критериями в круглой скобке. Это особенно важно в Objective-C, потому что часто с помощью геттеров и сеттеров управляется память (например, когда значение присваивается ivar, в качестве сеттера он может сохранить и в конечном итоге освободить назначенный объект). Помимо стратегии управления памятью, практика также способствует инкапсуляции и уменьшает количество тривиального кода, который в противном случае потребовался бы.

Очень часто объявляется ivar в скобках, а затем ассоциированное свойство (как в вашем примере), но это не является строго необходимым. Определение свойства и синтезирования - это все, что требуется, потому что синтез свойства неявно также создает ivar.

Подход, предлагаемый Apple (в шаблонах):

Определить свойство в файле заголовка, например:

@property (assign, readonly) gameCenter;

Затем синтезируйте и объявите ivar в реализации:

@synthesize gameCenter = __gameCenter;

Последняя строка синтезирует свойство gameCenter и утверждает, что любое значение, присвоенное свойству, будет сохранено в __gameCenter ivar. Опять же, это необязательно, но, определив ivar рядом с синтезатором, вы сокращаете места, где вы должны набирать имя ivar, но все еще явно называя его.

Ответ 2

{
BOOL gameCenterAvailable;
BOOL userAuthenticated;
}

указанные выше два называются переменными-членами Они не могут быть доступны за пределами класса. (Важная точка) (если вы не предоставите пользовательские геттеры и сеттеры)

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

тогда объявить то же самое, что и переменная-член, не требуется.

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

 @property (non..) 

Ответ 3

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

Когда вы объявляете переменную в настройках интерфейса, а получатели не написаны для вас. вы также можете указать некоторые модификаторы видимости для них, например @private, @public и т.д.