Должен ли я всегда использовать средства доступа для переменных экземпляра в Objective-C? - PullRequest
6 голосов
/ 05 октября 2009

Если у меня есть класс с некоторыми IBOutlets, кажется глупым создавать аксессоры для них.

Но тогда я чувствую, что нарушаю ООП, не всегда просматривая методы доступа для переменных экземпляра.

Я также чувствую то же самое в отношении некоторых переменных экземпляра, которые не должны быть открытыми, я бы не стал раскрывать внутреннюю работу некоторых классов. Я могу сделать настоящие ivars закрытыми, но стенография @property, похоже, не в состоянии указать видимость. Это приводит меня к тому, что я не создаю аксессоры, а просто получаю доступ к иврам напрямую. Я не уверен, если это осуждается, хотя. Это так?

Что думают об этом общеизвестном вопросе новичка? (Пожалуйста, игнорируйте точечный синтаксис)

Ответы [ 2 ]

4 голосов
/ 05 октября 2009

Я не уверен в непосредственном доступе к переменным экземпляра, я думаю, что этого не следует делать, но для некоторых переменных не имеет смысла использовать методы доступа Как и для IBOutlet s, которые вы упомянули.

Я могу помочь вам только с частными участниками. Начиная с Objective-C 2.0 вы можете объявлять расширения .

Расширения классов похожи на «анонимные» категории, за исключением того, что методы они заявляют, что должны быть реализованы в основной @implementation блок для соответствующий класс.

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

3 голосов
/ 05 ноября 2009

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...