2012-05-31 3 views
2

Я начинаю изучать Objective-C и у меня есть вопрос:Декларирование атрибуты класса Objective-C

При объявлении свойства класса, в чем разница между делать это?

ПЕРВЫЙ СЛУЧАЙ:

@interface ViewController : UIViewController 
{ 
UILabel *label; 
} 
@property(nonatomic,retain) UILabel *label; 
@end 

ВТОРОЙ СЛУЧАЙ:

@interface ViewController : UIViewController 
{ 

} 
@property(nonatomic,retain) UILabel *label; 

@end 

В первом случае, я объявляю класс с одним атрибутом (UILabel * этикетки), а затем, я объявляю свойства для этой метки.

Во втором случае я объявляю только свойства. Я всегда думал, что должен объявлять атрибуты класса.

+2

Возможный дубликат [Декларация собственности и автоматическое резервирование хранилища] (http://stackoverflow.com/questions/3238009/property-declaration-and-automatic-backing-storage-allocation) – outis

+0

Ups! Сожалею!! :( – dpbataller

ответ

2

В первом случае я объявляю класс с одним атрибутом (метка UILabel *), а позже я объявляю свойства для этой метки.

Нет, вы не являетесь. В первом случае вы объявляете переменную экземпляра с именем label и пару методов доступа, называемых -setLabel: и -label (известные вместе как свойство). У вас нет связи между свойством и переменной экземпляра. В настоящее время они являются независимыми сущностями.

Если вы сделаете это в реализации:

@synthesize label = fooBar; 

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

Я всегда думал, что я должен объявить класс атрибуты

Я привык думать то же самое, но на самом деле, если вы синтезирование собственности, нет никакого смысла в объявлении Ивара отдельно, потому что @synthesize будет сделайте это за вас (и в ARC примените правильные квалификаторы собственности). Теперь я сделать что-то вроде этого:

@synthesize label = label_; 

, так что я не использую переменную экземпляра, когда я имею в виду использовать свойство. например [label length] флагов ошибки, когда я имел в виду [[self label] length]

Кроме того, если изменить реализацию свойства не использовать переменный экземпляр, если вы еще не объявлены переменная экземпляру явно, он уйдет и случайное использование этого (+ те, что указаны в init и dealloc) будут помечены как ошибки.

+0

Я думаю, что у меня есть проблема понятий. Наш преподаватель Java, научил нас, что классы имеют атрибуты и методы. Так что я думал, что ярлык UILabel * будет атрибутом класса ViewController, Как мне позвонить «Переменные экземпляра или атрибуты? – dpbataller

+0

@dpbataller Я думаю, что это вопрос терминологии. Переменные, связанные с экземпляром класса, называются« переменными экземпляра ». Методы называются« методами ». Нет« переменных класса », но есть методы экземпляра и методы класса. С помощью методов экземпляра приемник (сам внутри метода) является экземпляром класса. С помощью методов класса получатель (self) является объектом, который представляет сам класс. – JeremyP

0

Другим отличием, что не было упомянуто:

В своем первом случае label имеет защищенный доступ. Переменные экземпляра по умолчанию @protected, если не указано иное.

С другой стороны, во втором случае label является закрытым (по крайней мере, в моем компиляторе).

Эта разница имеет значение, если у вас есть подклассы.

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