objective-c - Objective-C 中的静态变量声明有何不同?

标签 objective-c c cocoa global-variables static-variables

请查看此 header :

// Test.h
@interface Test : NSObject @end

extern id A;               // (0)
//extern static id B;      // (1) Uncomment to get a compiling error
extern id C;               // (2)
//extern static id D;      // (3) Uncomment to get a compiling error

在这个实现中:

// Test.m
#import "Test.h"

id A = @"A";               // (4)
static id B = @"B";        // (5)

@implementation Test

id C = @"C";               // (6)
static id D = @"D";        // (7)

@end

// Still Test.m

@interface Test2 : NSObject @end
@implementation Test2 : NSObject

+ (void)initialize {
    NSLog(@"%@ %@", A, B); // (8)
    NSLog(@"%@ %@", C, D); // (9)
}

@end

我有以下问题:

  1. 声明 (4) 和 (5) 或 (6) 和 (7) 之间是否存在根本区别?
  2. “外部”声明(4)和包含在实现范围(6)中有什么区别吗?
  3. 为什么在实现范围内声明的 (6) 和 (7) 可以在另一个实现范围 (9) 中访问?
  4. 为什么在 header 中声明的 (2) 可以访问在实现范围内声明的 (6)?
  5. 为什么 (1) 和 (3) 会产生错误 Cannot combining with previous 'extern' declaration specifier,但 (0) 和 (2) 编译时没有错误?

最佳答案

  1. 是的,在此上下文中使用的 static 将变量限制在文件的范围内。

    如果您有 (4) 并在项目的另一个文件中声明 id A = @"A",即使没有在 header 中声明 extern,那么您'会得到一个编译器错误。

    在 (5) 的情况下,如果您在另一个文件中声明 static id B = @"B" 那么它将正常工作。

  2. 不,这些是 C 变量声明,不遵循 Objective-C 范围规则。

  3. 由于 Objective-C 是 C 的超集,(6) 和 (7) 只是全局变量声明,就像它们在 C 中一样。

  4. (2) 并没有真正引用 (6),它只是向其他文件声明 #import 它“相信我,有一个名为 C 的变量> 在另一个文件中声明”,稍后在链接编译的目标文件时解析。

  5. 如前所述,static 将变量的范围限制在当前文件中,因此它与 extern 冲突,extern 表示变量在另一个文件中声明。

关于objective-c - Objective-C 中的静态变量声明有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382502/

相关文章:

objective-c - 使用 NSOpenpanel 和 NSfilemanager 查找目录内容

ios - 8 位颜色到 UIColor

c - 返回值不会改变,始终返回0

c++ - 在 Eclipse 中使用 C 库到 C++ 项目

objective-c - 使用 OS X 的 Storyboard初始化另一个窗口

objective-c - 如何在 Xcode 的自动完成弹出窗口中包含 Doxygen 方法描述?

iphone - 当数组为空时阻止 Tableview 崩溃?

xcode - 在 Xcode 之外对 Mac 应用程序进行数字签名失败

c - sleep 指令不适用于信号处理程序

objective-c - 如何在 Objective C 中获取随机 unicode 字符