我发现将.h中的常量定义为外部,然后在.m文件中分配常量是令人沮丧的。似乎是多余的。有没有理由不在头文件中定义常量?
典型的实施方式是:
// Constants.h
@interface Constants : NSObject
extern NSString *const kPCFavorites;
@end
然后实施:
// Constants.m
@implementation Constants
NSString *const kPCFavorites = @"PCFavorites";
@end
但是,我可以这样做:
// Constants.h
static NSString *const kPCFavorites = @"PCFavorites";
@interface Constants : NSObject
@end
显然,这最后一个定义甚至不需要接口或实现,因此两者都可以省略并成为:
// Constants.h
static NSString *const kPCFavorites = @"PCFavorites";
根本没有.m文件。
这对我来说似乎更清洁。为什么我们不这样实现常量?我已经两种方式定义它们,并且在XCode 5中没有编译或运行时错误。
答案 0 :(得分:2)
静态变量具有文件范围。如果编译包含带静态变量的头文件的文件,则该变量将存在于编译文件中。如果使用相同的头文件编译另一个文件,则会有第二个静态变量,依此类推。如果包含1000个源文件的标头,则会获得1000个静态变量,这些变量都具有相同的名称。
答案 1 :(得分:2)
由于
static NSString * const kPCFavorites = @"PCFavorites";
声明变量,而不是常量。 C实际上没有办法声明一个符号常量(除了enum
,它只适用于整数)。
因此,如果您使用此方法,则#include
您的标头的每个文件都将拥有自己的名为kPCFavorites
的变量。从历史上看,这意味着您的程序会因kPCFavourites
和字符串@"PCFavourites"
的所有副本而增加,尽管更现代的链接器可能会设法摆脱部分或全部重复(当然我希望链接器只留下一个字符串本身的副本;它是否可以摆脱额外的指针变量我不确定 - 但它很容易测试。)