我在objective-c中做了一些关于静态变量的研究,我发现人们在不同的地方声明了静态变量,这让我很困惑。
对于以下代码,我可以将static NSUInteger counter;
放在实现之外吗? (紧随我的#import" xxx.h")
我可以将static NSUInteger counter;
放在+ initialize类方法中吗?
我可以将static NSUInteger counter;
放入实例方法吗?
最重要的是,有什么区别以及如何选择宣告它们?
谢谢!
@implementation MyClass
static NSUInteger counter;
+(void)initialize {
if (self == [MyClass class]) {
counter = 0;
}
}
@end
答案 0 :(得分:8)
您提供的版本中只有两个版本。在实现块内部或外部声明它们之间没有区别,因为静态变量不与类关联,而是与文件本身关联。由于同样的原因,在类方法或实例方法中声明它们之间也没有区别。
在方法内部声明它们之间的唯一区别是,如果它在方法中声明,则只能从同一方法中访问它。
最好在最具体的范围内声明一个变量,这样就不存在在意外导致错误的地方使用变量的风险。如果您只需要访问方法中的静态变量,请在那里声明它。否则在文件中的任何其他位置声明它(在您需要的位置上方)。你究竟放在哪里纯粹是一种风格的东西。我个人更喜欢它是在导入之后但在@implementation之前(如果我添加一个,则为类扩展)。
答案 1 :(得分:5)
变量的static
属性控制变量的生存期和其名称的可见性。
静态变量具有与全局变量相同的生存期 - 应用程序的整个执行时间。
静态变量的可见性取决于其声明的位置:
if
语句的块中,那么它在该块之外是不可见的。答案 2 :(得分:1)
你可以把它放在所有这些地方。如果变量在方法/函数中,那么它将在调用之间保持其值。如果它位于文件的顶部,则表示只能通过该文件中的代码访问它。
一个文件中的多个函数/方法访问的全局变量(但从不在另一个文件中)通常被声明为静态变量,以防止与其他文件中具有相同名称的其他变量冲突。如果需要通过单个方法访问变量,并且需要在调用之间保持它的值,则可以将变量设置为static并在方法中声明它以使代码更紧凑。