Public / Private
Вы можете объявить свои iVars, как в файле @interface, только для чтения, но затем повторно объявить их в категории, чтобы ваш класс мог их изменить. Вот краткое введение в категории .
Пример:
//MyClass.h
@interface MyClass : NSObject {
NSString *name;
}
@property (readonly) NSString *name;
@end
И в файле реализации вы можете переопределить это:
//MyClass.m
@interface MyClass () //declare the class extension
@property (readwrite, copy) NSString *name; //redeclare the property
@end
@implementation MyClass
@synthesize name;
@end
Теперь свойство name
доступно только для чтения классу, но может быть изменено классом через синтаксис свойства или синтаксис setter / getter.
Действительно частные iVars
Если вы хотите сохранить конфиденциальность iVars и получать к ним доступ только напрямую, без использования синтаксиса @property, вы можете объявить их с ключевым словом @private
. Но затем вы говорите: «Ах, но они всегда могут получить значение вне класса, используя методы KVC, такие как setValueForKey:
». В этом случае взгляните на метод класса протокола NSKeyValueCoding + (BOOL)accessInstanceVariablesDirectly
, который останавливает это.
IBOutlets как свойства
рекомендуемый рекомендуемый способ - использовать @property и @synthesize. Для Mac OS X вы можете просто объявить их как свойства только для чтения. Например:
//MyClass.h
@interface MyClass : NSObject {
NSView *myView;
}
@property (readonly) IBOutlet NSView *myView;
@end
//MyClass.m
@implementation MyClass
@synthesize myView;
@end