我知道在Objective-C中可以使用@public关键字定义公共实例变量。 然而,Objective-C语法不允许访问其他类的实例变量。 @public实例变量有哪些特点?或者说,我该如何访问其他类的实例变量呢?
我知道在Objective-C中可以使用@public关键字定义公共实例变量。 然而,Objective-C语法不允许访问其他类的实例变量。 @public实例变量有哪些特点?或者说,我该如何访问其他类的实例变量呢?
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);
我希望那有帮助到你!
...
@public
int a;
...
myObject->a = 1;
您需要编写访问器方法来实现这一点。面向对象设计意味着一个类不应该关心另一个类对象的内部结构。
话虽如此,id只是一个指针,所以你可以使用obj->ivar,前提是你知道自己在做什么,并且没有办法编写适当的访问器方法。