ObjectiveC: где объявлять свойства частных экземпляров?
У меня есть следующий интерфейс класса:
@interface MyClass : NSObject
@property int publicProperty;
@end
то реализация:
@interface MyClass() // class extension
- (void)privateMethod; // private methods
@end
@implementation MyClass {
int _privateProperty;
}
@property int privateProperty = _privateProperty;
@end
это то, что показал парень Apple в WWDC, но есть ли причина, по которой NOT класть _privateProperty в расширение класса, например:
@interface MyClass() // class extension
{
int _privateProperty;
}
- (void)privateMethod; // private methods
@end
Спасибо!
Ответы
Ответ 1
Вам не нужно объявлять свои ivars как в интерфейсе, так и в реализации. Поскольку вы хотите сделать их частными, вы можете просто объявить их в файле реализации следующим образом:
@implementation {
int firstVariable;
int secondVariable;
...
}
//properties and code for your methods
Если вы этого захотите, вы можете создать методы getter и setter, чтобы вы могли получить доступ к этим переменным.
Человек, с которым вы говорили, был прав, подумал, что нет никаких причин, по которым вы НЕ объявляете их одинаково в интерфейсе. Некоторые книги на самом деле учат вас, что @interface показывает публичное лицо класса, а то, что у вас есть в реализации, будет закрытым.
Ответ 2
Я обычно "принудительно" закрываю с расширением в реализации
В заголовке
@interface MyClass : NSObject
{
}
@property (nonatomic, assign) int publicProperty;
@end
В вашем файле реализации:
@interface MyClass ()
@property (nonatomic, assign) int privateProperty;
@end
@implementation MyClass
@synthesize privateProperty;
@synthesize publicProperty;
@end
Ответ 3
Вы хотите, чтобы вы объявляли частные переменные экземпляра?
Вы можете сделать это:
@interface MyClass()
{
@private //makes the following ivar private
int _privateProperty;
}
Ответ 4
С помощью "современной среды исполнения" (64-разрядной версии MacOS после 10.5 и всех версий iOS) вам не нужно вообще объявлять переменные экземпляра.
// MyClass.h
@interface MyClass : NSObject
@property int publicProperty;
@end
// MyClass.m
@implementation MyClass
@synthesize publicProperty = _privateProperty; // int _privateProperty is automatically synthesized for you.
@end