如何在Objective-C中从另一个类访问@public实例变量?

14

我知道在Objective-C中可以使用@public关键字定义公共实例变量。 然而,Objective-C语法不允许访问其他类的实例变量。 @public实例变量有哪些特点?或者说,我该如何访问其他类的实例变量呢?

3个回答

59

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

我希望那有帮助到你!


1
感谢您详细的回答。这正是我想知道的! - eonil
12
哈哈,这让我早上心情很好。好答案。 - Chris

6
您可以使用“ ->”(通过指针成员)运算符访问它,就像您通常访问c结构的成员一样(请注意,您始终拥有obj-c中对象的指针):
...
@public
int a;
...

myObject->a = 1;

2

您需要编写访问器方法来实现这一点。面向对象设计意味着一个类不应该关心另一个类对象的内部结构。

话虽如此,id只是一个指针,所以你可以使用obj->ivar,前提是你知道自己在做什么,并且没有办法编写适当的访问器方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接