编写代码时经常要定义常量
static const NSTimeInterval KAnimationDuration = 0.3;
复制代码
-
使用类型变量,可以清楚地描述常量的含义,以及它的类型。
-
命名法:若常量局限于某“编译单元”(translation unit,也就是实现文件,.m文件)之内,则在前面加字母k;若常量在类之外可见,则通常以类名为前缀。
-
变量一定要同时用
static
和const
来声明。如果试图对const后面的变量修改,则编译器会报错。static && const区别 -
如果不加static,若另一个编译单元文件中也声明了同名变量,编译器会报错
-
如果要对外公开某个常量,则需要使用
extern
关键字在头文件中声明,然后在实现文件中定义。从右向左来理解, extern NSString * const constValue; constValue 是一个指针, const 只修饰右边的值,表明是只读,不能被修改 NSString 指明常量类型,指向NSString 对象 extern 指明可以被外部访问。编译器会明白无需查看其定义,就可以使用此常量。 复制代码
-
此类常量必须要定义,而且只能定义一次。通常将其定义在与声明该常量的头文件相对应的实现文件里。由实现文件生成目标文件时,编译器会在数据段(data section)为字符串分配存储空间。链接器会把此目标文件与其他目标文件相链接,以生成最终的二进制文件。凡是用到这个全局符号的地方,链接器都能将其解析。
static && const && define
static:
-
是用来声明静态变量,也叫做
内部
全局变量,一般只会在实现文件(.m文件)中出现。 -
静态变量只会初始化一次。
-
在方法内,修饰局部变量,会延长变量的生命周期,程序结束才会销毁,
-
在方法外,修饰全局变量,会修改变量的作用域,在整个文件,所有方法内都可以访问该变量。
-
静态变量属于静态存储方式,跟全局变量一样存储在静态存储区。
- (void)increasing { int b = 0; static int a = 0; a ++; b ++; NSLog(@"====%d===%d", a, b); } [self increasing]; //====1===1 [self increasing]; //====2===1 复制代码
const:
-
修饰右边的变量
-
被const修饰的变量是只读的
-
一般都使用
NSString * const constValue;
//constValue 不可变,*constValue 可变 NSString * const constValue; //constValue 可变,*constValue 不可变 const NSString * constValue; //都不可变 const NSString * const constValue; 复制代码
define
-
只是在预处理器里进行文本替换,没有类型,不做任何类型检查,大量宏会导致二进制文件变大。
-
宏可以定义一些函数和方法。
# define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__); 复制代码
总结:
1. 不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译前
据此执行查找与替换操作。如果有人重新定义了常量值,编译器也不会产生警告,可能会导致应用程序中的常量值不一致
2. 在实现文件中使用static const 来定义“只在编译单元内可见的常量”。
3. 在头文件中使用extern来声明全局变量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区别,通常用与之相关的类名做前缀