【问题标题】:How to access @public instance variable from another class in Objective-C?如何从 Objective-C 中的另一个类访问 @public 实例变量?
【发布时间】:2011-01-12 01:14:07
【问题描述】:

我知道可以使用@public 关键字定义公共实例变量。 但是,Objective-C 语法不允许访问其他类的变量。 我应该从@public Ivar 获得哪些功能?或者我如何访问其他班级的 Ivar?

【问题讨论】:

    标签: objective-c public-fields


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      希望对你有所帮助!

      【讨论】:

      • 感谢您的详细解答。这正是我想知道的!
      • 哈哈,这让我度过了一个早晨。好答案
      【解决方案3】:

      您可以像使用 -> (按指针的成员)运算符一样访问它,就像您通常访问 c 结构的成员一样(请注意,您总是有一个指向 obj-c 中的对象的指针):

      ...
      @public
      int a;
      ...
      
      myObject->a = 1;
      

      【讨论】:

        猜你喜欢
        • 2011-07-26
        • 2012-01-23
        • 2012-05-21
        • 1970-01-01
        • 2020-04-14
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        相关资源
        最近更新 更多