我希望有一个变量,我可以通过导入头文件访问任何地方,但我也希望它是静态的,因为只有一个创建的头文件.在我的.我指定m文件

static BOOL LogStuff = NO;

在初始化方法中,我设置了日志(log)记录值:

+ (void)initialize
{
    LogStuff = ... //whatever
}

但是,我希望通过导入.h文件,所以我想这样做:

static extern BOOL LogStuff;

但我不能这么做.有可能做我想做的事吗?谢谢

推荐答案

在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关键字的全局范围内定义它.内部链接和外部链接是互斥的,不能将变量同时声明为externstatic.

另一种 Select 是使用类方法,而不是变量.这将使功能保持在类的范围内,这在语义上更有意义,如果您愿意,也可以将其设置为@private.它确实会增加一个边际性能损失,但这不太可能成为应用程序中的瓶颈(如果您怀疑是瓶颈,请始终首先分析).

Objective-c相关问答推荐

Objective-c中release和dealloc的区别

'if not' 的 Objective-C 预处理器指令

将 CSS 插入 UIWebView / WKWebView 中加载的 HTML

NSTimeInterval 格式

在 Objective-C 类中混合 C 函数

带有语法高亮的 UITextView

对 nil 对象进行快速枚举

改变 setContentOffset:animated: 的速度?

适用于 ios 的 360° 全景库

切换隐私设置将杀死应用程序

UITextView 禁用文本 Select

更改 UIBarButtonItem 的 Tint colored颜色

立即检测 iOS 方向变化

对 NSTimer 目标的弱引用以防止保留循环

获取当前调度队列?

使用 UINavigationController 在 UIPageViewController 中下推内容

如何在键盘上添加完成按钮?

BOOL到 NSString

@package 指令在 Objective-C 中的作用是什么?

CALayer:仅在一侧添加边框