Используя современные версии Xcode (что-то около 4.2 или более поздней), нет причин объявлять iVar в вашем заголовке, НИКОГДАВсе общедоступное должно быть объявлено как собственность.
Многие забывают, что объекты Objective C на самом деле являются указателями на структуры C.Таким образом, любой iVar, объявленный в вашем заголовке, может быть доступен напрямую, передавая ваши геттеры и сеттеры, используя myObject->myPublicIVar
.Особенно в коде не-ARC, это чрезвычайно опасно.Директива @private
запрещает использование оператора ->
для доступа к iVars, но все еще загромождает файл заголовка.Нет смысла в @private
, когда есть лучшие способы.
Все, что личное, должно быть объявлено в вашем файле .m.Часто для этого требуется расширение класса, например:
// The .h file
@interface Foo : NSObject
@property (nonatomic, strong) NSString *myPublicString;
@end
// The .m file
@interface Foo ()
@property (nonatomic, strong) NSString *myPrivateString;
@end
@implementation Foo {
NSString *myPrivateIVar;
}
// Xcode 4.5 or later will not require these @synthesize
@synthesize myPublicString = _myPublicString;
@synthesize myPrivateString = _myPrivateString;
@end
Реализация, подобная этой, предоставляет открытое свойство, поддерживаемое iVar, частное свойство, поддерживаемое iVar, и частный независимый iVar.Я включил директивы @synthesize, но они не нужны при использовании современных инструментов.