前言
之前对于 static
, const
, extern
的使用都只是照搬,并不知道其中的含义,正好最近在项目中也运用到了所以做一个记录。
我们经常在注册 UITableViewCell
时会用到一个 identifier
的关键字,那么我们的.m文件的代码中经常会出现这样一句代码:
static NSString * const 变量名字 = @"变量内容";
下面我们来介绍下这些关键字的意思:
static
在一个全局变量前,加上这个关键字,那么该变量就会被定义成为一个静态的全局变量,静态的全局变量在声明它的整个文件都是可见的,文件之外是不可见的,一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区,自动变量一般会随着函数的退出而释放空间而静态变量并不会因为函数的退出而释放空间。定义静态变量的优势在于它可以节省内存。
extern
这个关键字是为了告诉编译器“在当前编译的文件中,有一个标识符虽然不是本文件定义的,但是它可能在其他的文件中定义。”,我们一般会这样写:
//xxxx.h
extern NSString *defaultSomething;
//xxxx.m
NSString *defaultSomething = @"xxxx";
extern与static
这两个关键字同样是修饰全局变量的,但是他们有着很大的区别。
-
static
修饰的全局变量,将会变为全局静态变量,其作用域为这个变量所在的文件内。 -
extern
修饰的全局变量,默认是有外部链接的,但它的作用域则是整个工程,并且它的定义可以是在工程内的任意一个文件中。
const
这个关键字可以将一个变量转换成一个常量,相当于 Swift
中的var
与 let
修饰符,但是 const
的位置不同它的作用也是不同:
int me;
1.const int *p1 = &me;
2.int* const p2 = &me;
3.int const *p3 = &me
在上面的代码中1当我们试着去修改 *p1
的时候编译器会告诉我们 *p1
是不能被修改的,而我们去修改 p1
的时候可以正常修改。当我们试着去修改代码2中 *p2
的时候是可以正常修改的, 但是修改 p2
的时候发现我们无法修改。那么对于代码3来说情况与代码1的一样,由此我们可以知道 const
修饰的是它右边的部分。
我们在回过头来看我们通常写的 static NSString * const cellIdentifer = @"cell"
这段代码时就能很好的理解了其中的意思了。