Я довольно смущен свойствами и переменными экземпляра в Objective-C.Свойства и переменные экземпляра в Objective-C
Я нахожусь на полпути через «Программирование какао Аарона Хиллегасса для Mac OS X», и все логично. Вы бы объявить класс что-то вроде этого:
@class Something;
@interface MyClass : NSObject {
NSString *name;
NSArray *items;
Something *something;
IBOutlet NSTextField *myTextField;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
Поскольку другие объекты должны манипулировать наши переменные экземпляра
name
иitems
, мы используем@property
/@synthesize
для создания Accessors/мутаторов для них. В нашем классе мы не используем accessors/mutators - мы просто напрямую взаимодействуем с переменной экземпляра.something
- это просто переменная экземпляра, которую мы собираемся использовать в нашем классе, и поскольку никто другой не должен ее использовать, мы не создаем для этого пару аксессуаров и мутаторов.Нам нужно взаимодействовать с текстовым полем в нашем пользовательском интерфейсе, поэтому мы объявляем для него
IBOutlet
, подключаем его, и все готово.
Все очень логично.
Однако в мире iPhone все выглядит по-другому. Люди объявляют свойства для каждой отдельной переменной экземпляра, объявляют свойства для IBOutlets
и используют accessors/mutators для взаимодействия с переменными экземпляра в пределах класса (например, они будут писать [self setName:@"Test"]
, а не name = @"Test"
).
Почему? Что происходит? Являются ли эти различия конкретными для iPhone? В чем преимущества объявления свойств для всех переменных экземпляра, объявления свойств для IBOutlets
и использования аксессуаров/мутаторов в вашем собственном классе?
Для тех, кто в подобной ситуации: в дополнение к ответы на приведенные ниже, см http://stackoverflow.com/questions/1221516/does-an-iboutlet-needs- to-be-a-property-synthesized и http://stackoverflow.com/questions/1250518/what-happens-if-i-dont-retain-iboutlet для того, почему вы объявляете IBOutlets как свойства. –