在objective-c中声明静态变量的位置?

时间:2014-04-03 23:01:14

标签: ios objective-c cocoa-touch static

我在objective-c中做了一些关于静态变量的研究,我发现人们在不同的地方声明了静态变量,这让我很困惑。

  1. 对于以下代码,我可以将static NSUInteger counter;放在实现之外吗? (紧随我的#import" xxx.h")

  2. 我可以将static NSUInteger counter;放在+ initialize类方法中吗?

  3. 我可以将static NSUInteger counter;放入实例方法吗?

  4. 最重要的是,有什么区别以及如何选择宣告它们?

  5. 谢谢!

    @implementation MyClass
    
    static NSUInteger counter;
    
    +(void)initialize {
        if (self == [MyClass class]) {
            counter = 0;
        }
    }
    
    @end
    

3 个答案:

答案 0 :(得分:8)

您提供的版本中只有两个版本。在实现块内部或外部声明它们之间没有区别,因为静态变量不与类关联,而是与文件本身关联。由于同样的原因,在类方法或实例方法中声明它们之间也没有区别。

在方法内部声明它们之间的唯一区别是,如果它在方法中声明,则只能从同一方法中访问它。

最好在最具体的范围内声明一个变量,这样就不存在在意外导致错误的地方使用变量的风险。如果您只需要访问方法中的静态变量,请在那里声明它。否则在文件中的任何其他位置声明它(在您需要的位置上方)。你究竟放在哪里纯粹是一种风格的东西。我个人更喜欢它是在导入之后但在@implementation之前(如果我添加一个,则为类扩展)。

答案 1 :(得分:5)

变量的static属性控制变量的生存期和其名称的可见性

静态变量具有与全局变量相同的生存期 - 应用程序的整个执行时间。

静态变量的可见性取决于其声明的位置:

  • 如果声明在文件中,但在任何函数或方法声明之外,则其名称在整个单个文件中都可见。
  • 如果声明在任何块内,则变量名称在整个块中的声明点可见,包括任何封闭的块,除非在这些封闭的块中被声明隐藏。也就是说,如果声明直接发生在方法/函数体内,那么它只在该方法/函数中可见;如果它出现在一个if语句的块中,那么它在该块之外是不可见的。

答案 2 :(得分:1)

你可以把它放在所有这些地方。如果变量在方法/函数中,那么它将在调用之间保持其值。如果它位于文件的顶部,则表示只能通过该文件中的代码访问它。

一个文件中的多个函数/方法访问的全局变量(但从不在另一个文件中)通常被声明为静态变量,以防止与其他文件中具有相同名称的其他变量冲突。如果需要通过单个方法访问变量,并且需要在调用之间保持它的值,则可以将变量设置为static并在方法中声明它以使代码更紧凑。