在ObjuleC中,static
表示C++类中的static
个不同的东西,在静态类数据成员和静态类方法的上下文中.在C和Objective-C中,全局范围内的static
变量或函数意味着该符号有internal linkage.
内部链接意味着该符号是当前translation unit的本地符号,当前translation unit是正在编译的当前源文件(.c
或.m
)及其递归包含的所有头文件.该符号不能从其他翻译单元引用,您可以在其他翻译单元中使用具有相同名称的内部链接的其他符号.
因此,如果有一个头文件将一个变量声明为static
,则包含该头文件的每个源文件都将获得一个separate全局变量.一个源文件中对该变量的所有引用都将引用同一个变量,但不同源文件中的引用将引用different个变量.
如果你想要一个单一的全局变量,你不能像C++那样在类范围内拥有它.一个选项是创建一个带有external linkage的全局变量:在头文件中声明带有extern
关键字的变量,然后在one源文件中,在不带extern
关键字的全局范围内定义它.内部链接和外部链接是互斥的,不能将变量同时声明为extern
和static
.
另一种 Select 是使用类方法,而不是变量.这将使功能保持在类的范围内,这在语义上更有意义,如果您愿意,也可以将其设置为@private
.它确实会增加一个边际性能损失,但这不太可能成为应用程序中的瓶颈(如果您怀疑是瓶颈,请始终首先分析).