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

wz3*_*366 3 static cocoa-touch objective-c ios

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

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

  2. 我可以把static NSUInteger counter;+ initialize类方法放进去吗?

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

  4. 最重要的是,有什么区别以及如何选择在哪里声明它们?

谢谢!

@implementation MyClass

static NSUInteger counter;

+(void)initialize {
    if (self == [MyClass class]) {
        counter = 0;
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

dre*_*wag 9

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

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

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

  • 他的意思是"与班级无关,而与文件本身无关". (3认同)

CRD*_*CRD 5

static变量的属性控制变量的生命周期和名称的可见性.

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

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

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