Как получить доступ к @public переменной экземпляра от другого класса в Objective C?

Я знаю, что возможно определить общедоступную переменную экземпляра с @public ключевым словом. Однако синтаксис Objective C не позволяет получать доступ к переменной другого класса. Какие функции должны, я ожидал от @public Ivar? Или как я получаю доступ к Ivars другого класса?

14
задан Eonil 2 February 2010 в 07:23
поделиться

3 ответа

Objective-C, как надмножество C, определенно разрешает доступ к общедоступным переменным экземпляра извне реализации класса. Возможно, вы слышали, что это запрещено , потому что это крайне не рекомендуется. В большинстве случаев, если вы хотите получить доступ к переменной экземпляра вне контекста реализации, вам следует использовать средства доступа и мутаторы (свойства).

Класс Objective-C на самом деле сводится к простой старой структуре C с полем isa (это то, что делает его объектом), где доступны общедоступные поля. Поскольку, когда мы имеем дело с экземплярами классов, мы работаем с указателем на объект (специальная структура). Таким образом, мы получаем доступ к общедоступным полям, используя -> .

Вот пример:

@interface SomebodyIsntEncapsulating : NSBadIdea {
  @public
  NSString *badIdea;
  BOOL shouldntDoIt;

  @protected
  NSString *ahThatsBetterThankGod;

  @private
  NSString *sweetThanksNowEvenMySubclassesCantTouchMe;
}

Теперь, в совершенно другом контексте, мы могли бы:

SomebodyIsntEncapsulating *whatOh = [[SomebodyIsntEncapsulating alloc]
                                       initWithDanger:kDangerLevelEpicBraceYourself];
whatOh->badIdea = [@"I'm a public field. Make sure to retain or copy me!" copy];
NSLog(@"Please! Write some accessors and mutators!: %@", whatOh->badIdea);

Надеюсь, это вам помогло!

57
ответ дан 1 December 2019 в 05:55
поделиться

Вы можете получить к нему доступ, как с помощью оператора -> (элемент за указателем), как вы обычно получаете доступ к элементам c-структуры (обратите внимание, что у вас всегда есть указатель на объект в obj -c):

...
@public
int a;
...

myObject->a = 1;
6
ответ дан 1 December 2019 в 05:55
поделиться

Для этого вам нужно написать методы доступа. Объектно-ориентированный дизайн подразумевает, что класс не должен заботиться о внутренней структуре объектов другого класса.

Тем не менее, id - это просто указатель, поэтому вы можете использовать obj-> ivar, если вы знаете, что делаете, и нет возможности написать правильный метод доступа.

2
ответ дан 1 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: