2013-01-23 1 views
1

я написал следующую цель C класс ..Как получить доступ к другим членам класса (ivars) в классе, не делая его общедоступным?

@interface thumb_user_info : NSObject 
{ 
@public // Otherwise I was not able to access in other class. 
    NSString *user_name; 
    int  user_id; 
} 
@end 

Когда я создаю экземпляр в другом классе и попытаться установить значение для user_id, он показывает ошибку «она защищена», как получить доступ к этим Ивар без делая его общедоступным, как указано выше. Я знаю его самые основы в объективе C, я не хочу колебаться, чтобы прояснить ситуацию.

Примечание: Я попытался с помощью синтеза также ... еще такая же ошибка ...

спасибо.

+0

ли вы добавить свойство для что объекты? –

+0

@MidhunMP Я пытался и синтезировал в .mm, я ожидал, что он создаст геттер, но такую ​​же ошибку. – Newbee

+0

Удалить «@public». После "}" добавить "@property NSString * имя_пользователя;" В файле .m напишите: «@synthesize user_name»; Я не вижу причин, почему это не сработает. – Petar

ответ

3

То, о чем вы просите, является одним из основополагающих принципов ООП, объектно-ориентированного программирования.

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

Если вы хотите, чтобы они были видимыми, сделайте общедоступным.

Если вы хотите, чтобы их скрывали, но наследовали, вы делаете их защищенными.

Таким образом, вы не можете получить доступ к своим личным иварам/методам извне собственного класса.

Если вы хотите получить доступ к значению частных ivars, сделайте общедоступный метод и косвенно получите/верните значение.

синтезировать создает методы для ivars (private/protected/public), если он находится в .h, он становится общедоступным.

+0

Я, но в чем смысл синтеза там, он будет генерировать setter и getter для него правильно? – Newbee

+0

синтезировать делает методы общедоступными, а не ivar. –

+0

instance_of_thumb-> user_id = 5; // Будет ли он ссылаться на getter или нет? // Я видел в одном из примеров, они упомянули, что он будет вызывать getter, если бы мы синтезировали – Newbee

2

Это экземпляр вар, а не свойство, так что вы не можете установить значение для них yourclass.user_name = userName, я думаю, вы должны лучше добавить какой-то метод, чтобы установить такие значения, как:

- (void)setupUserName:(NSString *)userName 
{ 
    user_name = userName 
}