Я знаю, что можно определить переменную public экземпляра с ключевым словом @public. Однако синтаксис Objective-C не позволяет получить доступ к переменной другого класса. Какие функции я должен ожидать от @public Ivar? Или как мне получить доступ к другим классам Ivars?
Как получить доступ к переменной @public экземпляра из другого класса в Objective-C?
Ответ 1
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);
Я надеюсь, что это помогло вам!
Ответ 2
Вы можете получить к нему доступ, например, используя → (оператор by by pointer), как обычно вы получаете доступ к элементам c-структуры (обратите внимание, что вы всегда имеете указатель на объект в obj-c):
...
@public
int a;
...
myObject->a = 1;
Ответ 3
Вы должны написать методы доступа для этого. Объектно-ориентированный дизайн подразумевает, что класс не должен заботиться о внутренней структуре объектов другого класса.
Тем не менее, id - это просто указатель, поэтому вы можете делать obj- > ivar, если вы знаете, что делаете, и нет способа написать правильный метод доступа.