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);
Надеюсь, это помогло вам!