客观c - 静态变量令人费解的行为

时间:2012-10-11 02:48:49

标签: objective-c c static

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

static NSMutableDictionary *dictLookup;

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

dictLookup = [NSMutableDictionary dictionary];

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

但是,当我插入断点并进行检查时,dictLookup永远不会变成除nil之外的任何东西。

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

我发现有更好的方法可以做我想做的事。但是这里发生了什么? (1)为什么我不能将dictLookup设置为任何东西?

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

和(3)当我从头开始设计一个新的'test'项目时,使用一个像你所描述的新的.h / .m文件组合,我可以设置dictLookup和插入键。为什么能说出这种差异?

1 个答案:

答案 0 :(得分:3)

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

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

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

    extern NSMutableDictionary *dictLookup;
    

    然后在其中一个.m文件中定义,如下所示:

    NSMutableDictionary *dictLookup;