不要用预处理指令定义常量。这样定义出来的常量不含类型信息。编译器只会在编译前,据此进行查找和替换操作。即使有人重新定义了常量的值,编译器也不会产生禁告信息。这会导致程序中常量值不一致。
解决方法如下:
static const NSTimeInterval kAnimationDuration = 0.3;
用此方式定义的常量包含类型信息,好处清楚的描述了常量的含义。
注意常量的名称:常用的命名方法:若常量局限于某个编译单元(也就是实现文件中),则在前面加字母k,若常量在类外可见。则通常以类名为前缀。
注意常量的位置:若不打算公开这个常量,则应将其定义在使用该常量的实现的文件里。变量一定要同时用static与 const来声明。
用static 修饰则意味着该变量仅在定义此变量的编译单元可见。在Objectivec-C的语境下,“编译单元”一词通常指每个类的实现文件(.m 文件)
有时候需要对外公开某个变量,此类常量须放在”全局符号表“中。以便可以在定义该常量的编译单元之外使用。
定义方式如下:
//In the header file
extern NSString *const EOCStringConstant;
//In the Implementation file
NSString *const EOCStringConstant = @"VALUE";
此常量必须要定义,并且只能定义一次。通常将其定义在与声明变量的头文件相关的实现文件里。
在实现文件中使用static const 来定义“只在编译单元内可见的常量”,由于此类常量不在全局符号单元表中,无需为其名称加前缀。
在头文件中,使用extern来声明全局常量,并在相关得实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区隔,通常用与之相关的类名做前缀。
(这块内容其实就是讲得变量的作用域的问题,以及static和extern关键字的用法。和c++的中用法完全一致)。