在.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和插入键。为什么能说出这种差异?
答案 0 :(得分:3)
static
文件中声明.h
变量时,会在包含标头的每个.m
文件中重新定义它。将在每个文件中创建一个全新的变量,名称相同。.m
文件中的错误:该变量对于该文件是本地的,对于链接器是不可见的,因此没有“多个定义”错误。.m
文件。有些消息来源似乎说在C中,静态变量只能在声明它的文件中使用。
这是绝对正确的:static
变量非常类似于文件范围的全局变量,它应该在.m
文件中定义。如果你想共享一个变量,那么它需要是一个全局变量。 使用extern
关键字在标头中声明,就像这样
extern NSMutableDictionary *dictLookup;
然后在其中一个.m
文件中定义,如下所示:
NSMutableDictionary *dictLookup;