gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:12:04 25 4
gpt4 key购买 nike

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

static NSMutableDictionary *dictLookup;

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

dictLookup = [NSMutableDictionary dictionary];

dictLookup setValue:@"Hello?"forKey:@"再见"];

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

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

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

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

并且 (3) 当我从头开始设计一个新的“测试”项目时,使用一个新的 .h/.m 文件组合,如所描述的那样,我能够设置 dictLookup 并插入键。为什么可以解释这种差异?

最佳答案

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

Some sources seem to say that in C a static variable can only be used in the file in which it is declared.

完全正确:static 变量非常像文件范围的全局变量,它应该在 .m 文件中定义。如果你想共享一个变量,那么它需要是一个全局变量。 在 header 中使用 extern 关键字声明,如下所示

extern NSMutableDictionary *dictLookup;

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

NSMutableDictionary *dictLookup;

关于objective-c - objective-c - 静态变量令人费解的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12831457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com