【问题标题】:Newbie: about ios / objective -c variable definition in a class新手:关于ios/objective -c 类中的变量定义
【发布时间】:2013-04-26 13:44:21
【问题描述】:

我是 Objective-c 和 iOS 开发的新手。我有一个简单的问题要问:

我在一些 iOS 类实现文件中看到,人们使用如下代码:

@implementation BIDMyController

- (void)viewDidLoad{...}

上面的代码非常简单。但是,有时,我会看到如下的类实现代码:

@implementation BIDMyController{
    NSMutableArray *names;
}

- (void)viewDidLoad{...}

唯一的区别是添加了大括号,其中包括一些变量定义。大括号和变量是什么意思?它们是定义此类私有变量的 Object-C 风格吗?谁能给我解释一下?

【问题讨论】:

  • 你确定第二个实现是@implementation 而不是@interface?

标签: ios objective-c cocoa-touch ios5


【解决方案1】:

是的,这是一种声明仅在内部可见的实例变量 (ivars) 的方式。

见:https://stackoverflow.com/a/6891326/1597531

【讨论】:

    【解决方案2】:

    首先让我们解释一下什么是 iVar,然后为什么要在实现文件中声明它们:

    这些被称为实例变量(iVar),它们并不是专门的私有变量

    您可以使用以下指令更改 iVar 的行为方式:

    @private
    

    iVar 只能由声明它的类访问。

    @protected
    

    声明它的类和任何子类都可以访问 iVar。 如果您不声明指令,则默认使用该指令,并解释为什么您可能认为这是一种声明私有变量的方式。

    @public
    

    iVar 可以从 anwyehre 访问。

    @package
    

    可在应用程序或静态库的任何位置访问。

    如果您对某些术语感到困惑,请不要担心。大多数情况下不需要编写指令,因为@protected 是默认指令,它可以正常工作。

    因此,iVars 声明将如下所示:

    @interface BIDMyController{
       @protected
          NSString *protectedString
       @public
          NSString *publicString 
          NSString *piblicString2 //This iVar is public since it's after de @public directive
    
    }
    

    我在 interface 文件中声明变量,尽管正如您所指出的,它们可以在 implementation 文件中声明。唯一的区别是在实现文件上声明 iVar 是隐藏私有 iVar 的一种方式。 More about this here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2010-10-17
      • 2011-06-25
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多