【发布时间】:2011-01-12 01:14:07
【问题描述】:
我知道可以使用@public 关键字定义公共实例变量。 但是,Objective-C 语法不允许访问其他类的变量。 我应该从@public Ivar 获得哪些功能?或者我如何访问其他班级的 Ivar?
【问题讨论】:
我知道可以使用@public 关键字定义公共实例变量。 但是,Objective-C 语法不允许访问其他类的变量。 我应该从@public Ivar 获得哪些功能?或者我如何访问其他班级的 Ivar?
【问题讨论】:
您应该编写访问器方法来做到这一点。面向对象的设计意味着一个类不应该关心另一个类对象的内部结构。
也就是说,id 只是一个指针,所以你可以做 obj->ivar,前提是你知道自己在做什么,并且没有办法编写适当的访问器方法。
【讨论】:
Objective-C 作为 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);
希望对你有所帮助!
【讨论】:
您可以像使用 -> (按指针的成员)运算符一样访问它,就像您通常访问 c 结构的成员一样(请注意,您总是有一个指向 obj-c 中的对象的指针):
...
@public
int a;
...
myObject->a = 1;
【讨论】: