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

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

Ответы [ 3 ]

57 голосов
/ 02 февраля 2010

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);

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

6 голосов
/ 02 февраля 2010

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

...
@public
int a;
...

myObject->a = 1;
2 голосов
/ 02 февраля 2010

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

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

...