我不知道在使用Objective-C时,有什么理由将任何内容声明为外部内容。但是,当您将其与C或汇编程序模块混合使用时,可能会出现这种情况。
然而,使用
extern
的好处是,如果您真的需要节省大约20个字节的空间,常量将只在整个项目中存在一次。但是这带来了名称冲突的风险。其他库可能已经使用相同的名称声明了它们自己的外部内容。链接器会为它们使用内存中的完全相同的空间,尽管它们可能是不同类型的。
是的,在头文件中的
extern
声明应该伴随着.m文件中对应的定义。我不确定,但我认为您可以在.h文件中分配@"foo"。您甚至可以在@interface/@implementation-@end块之外声明它(我从未尝试过)。在这种情况下,变量将是全局的,并且即使没有
extern
关键字,也可以从任何地方访问。在编译时,编译器会抱怨在# include语句链中看不到其声明时访问它们。但是学术上,一个单独的.m文件可能包含两个或更多类(我绝对不建议这样做),然后该变量将从两个类中都可以访问,尽管它属于其中的一个。
最后,Objective-C只是ANSI C的附加组件。但是,将它们设置为静态变量没有意义。这些常量已经是静态的。在类甚至方法内部使用静态变量的目的是其范围(可见性)仅限于该类,但在运行时只有一个实例由该类的所有实例共享。
例如:
@implementation AClass : NSObject
static NSString *someString
- (void) setString:(NSString*) aString{
someString = aString;
}
- (NSString*) getString (){
return someString;
}
... and somewhere else:
AClass * a = [[AClass alloc] init];
AClass * b = [[AClass alloc] init];
[a setString:@"Me"];
[b setString;@"You"];
NSLog (@"String of a: ", [a getString]);
将会输出You
但不包括Me
如果这正是你想要的,并且仅在这种情况下,使用静态方法。
使用简单的预处理宏(我更喜欢这种方法,但我有点老派)的缺点是这些字符串每次使用宏时都会被复制到二进制文件中。显然,这对你来说根本不是一个选择,因为你甚至没有要求它们。然而,对于大多数用途,在常见的共享.h文件中使用预处理宏可以解决跨类管理常量的问题。