I know it's possible to define public instance variable with @public keyword. However, Objective-C syntax does not allow accessing other class' variable. What features should I expected from @public Ivar? Or how do I access other class' Ivars?
问问题
22752 次
3 回答
59
作为 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);
我希望这对你有帮助!
于 2010-02-02T07:35:51.160 回答
6
您可以像使用 -> (按指针的成员)运算符一样访问它,就像您通常访问 c 结构的成员一样(请注意,您总是有一个指向 obj-c 中的对象的指针):
...
@public
int a;
...
myObject->a = 1;
于 2010-02-02T07:35:30.583 回答
2
您应该编写访问器方法来做到这一点。面向对象的设计意味着一个类不应该关心另一个类对象的内部结构。
也就是说,id只是一个指针,因此您可以执行 obj->ivar,前提是您知道自己在做什么并且无法编写适当的访问器方法。
于 2010-02-02T07:38:39.180 回答