Объявление закрытых переменных-членов - PullRequest
9 голосов
/ 26 августа 2010

Я начал изучать Objective-C несколько недель назад и до сих пор не понимаю, как правильно управлять инкапсуляцией класса. Каков наилучший способ объявления закрытой переменной-члена в классе?

Кажется, что установка правильного метода get / setter для вашей переменной-члена с помощью "@property" - верный путь, а не просто объявление его в интерфейсе как @private Но мне кажется, что это все еще дает другим классам доступ к этим переменным. Даже если вы объявите свойство «только для чтения», внешний класс может получить доступ к ссылке на переменную-член и изменить ее!

Таким образом, я предполагаю, что лучший способ объявить закрытую переменную-член - это не включать никакие guetter / setter, не объявляя свойство. Я прав? Или есть лучший способ?

Спасибо

1 Ответ

23 голосов
/ 26 августа 2010

если вы не хотите, чтобы он был доступен другим классам, объявите @property в своей реализации, создав анонимную категорию для вашего класса.

Заголовочный файл:

// MyClass.h
@interface MyClass : NSObject {
    NSObject *_privateObject;
    NSObject *_readonlyObject;
    NSObject *_publicObject;
}

@property (nonatomic, retain, readonly) NSObject *readonlyObject;
@property (nonatomic, retain) NSObject *publicObject;

@end

Реализация:

// MyClass.m
@interface MyClass ()
    @property (nonatomic, retain) NSObject *privateObject;
    // Make it writable on the implementation
    @property (nonatomic, retain, readwrite) NSObject *readonlyObject;
@end

@implementation MyClass

@synthesize privateObject = _privateObject;
@synthesize readonlyObject = _readonlyObject;
@synthesize publicObject = _publicObject;

Это примеры трех разных свойств.

  • privateObject не отображается в других классах;
  • readonlyObject видим, но доступен только для чтения;
  • publicObject видим и может быть получен и установлен;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...