我知道可以使用@public关键字定义公共实例变量。 但是,Objective-C语法不允许访问其他类的变量。 我应该从@public Ivar中得到什么功能?或者我如何访问其他类'Ivars?
答案 0 :(得分:57)
作为C的超集,Objective-C肯定允许从类的实现之外访问公共实例变量。现在,您可能听说不允许的原因是它非常气馁。在大多数情况下,如果要访问实现上下文之外的实例变量,则应使用访问器和更改器(属性)。
Objective-C类实际上归结为一个带有isa
字段的普通C结构(这就是使它成为对象的东西),可以访问公共字段。因为当我们处理类的实例时,我们正在处理一个指向对象的指针(特殊结构)。因此,我们使用->
访问公共字段。
以下是一个例子:
@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 :(得分:6)
您可以像使用 - >一样访问它(通过指针成员)运算符,就像你通常访问c结构的成员一样(注意你总是有一个指向obj-c中对象的指针):
...
@public
int a;
...
myObject->a = 1;
答案 2 :(得分:2)
你应该编写访问器方法来做到这一点。面向对象的设计意味着一个类不应该关心另一个类的对象的内部结构。
那就是说, id 只是一个指针,所以你可以做obj-> ivar,前提是你知道自己在做什么,而且无法编写合适的存取方法。 / p>