【问题标题】:What does “@public” mean in Objective-C?Objective-C 中的“@public”是什么意思?
【发布时间】:2011-02-16 10:01:31
【问题描述】:

阅读question on @private 后,我明白它是如何工作的。但是,由于所有变量都默认为@protected,并且如果不定义访问器就无法真正访问变量,@public 究竟做了什么?什么时候用?

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    @public 表示 ivar 可以在任何地方访问。

    @private 表示类的实例可以访问 ivar

    @protected 表示类和子类的实例可以访问 ivar。

    要访问类外部的公共 ivar,请使用标准 C 结构指针运算符 -> 例如

    foo->instanceVarible = xyzzy;
    

    你什么时候使用它?就我而言:从来没有。我总是将实例变量定义为@private(IBOutlets 除外)并使用访问器在类外访问它们。

    【讨论】:

    • 我知道你从哪里来,但是,IMO 我发现总是用访问器创建私有变量,当它们实际上被设计为并充当公共时,这有点矫枉过正.
    • 一段时间后它会成为第二天性,当然,如果它们是对象,除非你使用 GC,否则无论如何你都需要访问器。
    【解决方案2】:

    你什么时候使用它?当你需要它是public。要从该类外部访问它(没有任何额外的访问器),就是这样。 :)

    【讨论】:

      【解决方案3】:

      @public 是可见性修饰符。这意味着声明为@public 的实例变量可以被任何类的实例访问。公共成员可以被子类或其他类访问。相反,私有成员不能被子类或其他类访问。​​

      【讨论】:

        【解决方案4】:

        这个问题是关于编码实践的。

        如果您正在编写非常严格的代码,您将始终使用@private 作为实例变量,以确保只有类函数可以访问它们。在我看来,这仅在非常特定的情况下是必需的,例如,类变量(一个类的多个实例有一个变量)。

        大多数时候@protected 最适合普通实例变量,因为它允许子类直接访问它们。它更自然,并且与扩展类的想法一致。根据您实际访问它们的方式,Objective C 可能实际上使用该类的 setter 和 getter 函数。 @protected 是高效代码和使代码更具可读性的理想选择。

        @public 保留用于快速或脏编程。直接访问实例成员可能会更快,或者您正在与另一种编程语言/库交互并且您正在编写一些胶水。我尽量避免它,因为这意味着代码维护更加困难。

        显然,您可以一直使用 @public - 回到 C 编程的美好时光。

        您当然可以选择不为类变量定义任何访问器,因为它是类内部的,或者因为您声明为 @public,但由于 Objective C 使得使用 @property@synthesize 对它们进行原型制作变得容易似乎没有多大意义。内部类变量不需要 setter/getter,因为任何类方法都可以直接访问它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-31
          • 1970-01-01
          • 1970-01-01
          • 2014-01-17
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多