9

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

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

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

Благодаря

ответ

23

, если вы не хотите его доступным для других классов, объявите @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 видна и может быть установлена ​​и установлена;
+0

Хорошо, поэтому, используя категорию, я могу полностью скрыть переменную-член. Но я все равно не использую «readonly» для видимого члена, так как он возвращает ссылку на объект. Можно просто изменить ссылку и написать над ней, даже если у нее нет сеттера. –

+0

Хороший вопрос! Я постараюсь выяснить, какой вид защиты - дать ему. Я предполагаю, что как только вы попытаетесь изменить значение вашего ссылочного объекта, он сделает копию, и изменения не распространяются на защищенный объект. Здесь приведена документация: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19 – vfn

+0

@Oliver , не могли бы вы задать для этого еще один вопрос и поместить свой код там, чтобы дать нам лучшее понимание этой проблемы. BTW «непризнанный селектор» означает, что у вас нет этого конкретного селектора, который может быть свойством или методом. Вы уверены, что объявили свойство с привилегиями «readwrite»? – vfn

 Смежные вопросы

  • Нет связанных вопросов^_^