1

在 .h 文件中,我有以下行(在任何 @interface 块之外):

static NSMutableDictionary *dictLookup;

在相应的 .m 文件中,我尝试在init类的方法中初始化该静态:

dictLookup = [NSMutableDictionary dictionary];

dictLookup setValue:@"Hello?" forKey:@"Goodbye"];

但是,当我插入断点并进行检查时,dictLookup 永远不会变成 nil。

此外,我在编译时收到一个奇怪的警告“未使用的变量 dictLookup”。奇怪的是,如果我删除静态声明,那么我会在方法中的行中收到“未声明的标识符”编译器错误init

从那以后,我发现有更好的方法来做我想做的事。但是这里发生了什么?(1) 为什么我不能将 dictLookup 设置为任何内容?

一些消息来源似乎说,在 C 中,静态变量只能在声明它的文件中使用。(2) 如果是这样,那么为什么编译器不会因 .m 文件中的错误而失败?鉴于(1),这似乎是设计编译器要做的合乎逻辑的事情。

(3) 当我从头开始设计一个新的“测试”项目时,使用一个新的 .h/.m 文件组合,就像描述的那样,我能够设置 dictLookup 和插入键。为什么会出现这种差异?

4

1 回答 1

3
  1. 当您在文件中声明static变量时,它会在包含标头.h的每个文件中重新定义。.m将在每个文件中创建一个全新的变量,名称相同。
  2. 这不是文件中的错误.m:该变量是该文件的本地变量,并且对链接器不可见,因此不存在“多重定义”错误。
  3. 那是因为您的测试项目使用了一个.m文件。

一些消息来源似乎说,在 C 中,静态变量只能在声明它的文件中使用。

这是绝对正确的:static变量非常像文件范围的全局变量,它应该在.m文件中定义。如果你想共享一个变量,那么它需要是一个全局变量。用关键字在标题中声明它,像这样extern

extern NSMutableDictionary *dictLookup;

然后在这样的文件之一中定义它:.m

NSMutableDictionary *dictLookup;
于 2012-10-11T03:04:11.423 回答