关键字const,static,extern
2018-11-16 本文已影响0人
yyggzc521
----------------------const--------------------
说起const就想起宏,其实const和宏是有很大区别的,两者的使用还要看具体的应用场景。另外Apple不推荐使用宏,这一点从工程创建就能看出来,之前创建完工程后自带pch文件,后来改为了手动创建pch。
区别:
编译时刻:const是编译阶段,宏是预编译(编译之前处理)。
编译检查:const会编译检查,报编译错误,宏不做检查;不会编译报错,只是简单的替换。
宏的好处:宏能定义一些函数、方法。 const不能。
宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换。
作用:
const修饰变量主要强调变量是不可修改的
//str是指针,*str是指针指向的内存里的值,const 修饰*str就是指针指向的内存里的值不能变,str这个指针可以改变,即可以指向别的地方
NSString const *str = @"faesfeg";
str = @"可以指向别的地方";
//这里str是指针,* str是指针指向的内存里面的值,const修饰str,代表内存地址不能改变
NSString * const str = @"efwferg";
str = @"这里修改会报错";
屏幕快照 2018-11-16 上午11.13.56.png
int c = 15;
int *p = &c;
*p = 20;
/**
*这段代码的意思
*在栈区分配一块内存区域,这块内存区域的名字叫c,里面存放着int类型的数据 值为15
*声明一个指针指向名称为c的这块内存区域
*将名称为c的这块内存区域的值改为20
*/
// 这两种写法是一样的,const只修饰右边的基本变量b
const int b = 20; // b:只读变量
int const b = 20; // b:只读变量
----------------------------------------------------------------------------------------------------------------------------------
const int c = 15;
int *p = &c;
*p = 20;
/**
*这段代码的意思
*在栈区分配一块内存区域,这块内存区域的名字叫c,里面存放着int类型的数据 值为15;由于c使用const修饰,代表这块内存区域的值不能改
*声明一个指针指向名称为c的这块内存区域,但是这里面会出现⚠️警告,提示不能修改
*将名称为c的这块内存区域的值改为20
*
*/
屏幕快照 2018-11-16 上午11.37.13.png
----------------------static--------------------
static分两种情况,修饰局部变量和全局变量
修饰局部变量
一般局部变量是存储在栈区的,它的生命周期是整个代码块,作用域也是整个代码块,一旦出了这个代码块,存储局部变量的这个栈内存就会被回收,局部变量也就被销毁了。
当用static修饰局部变量,被称为静态局部变量。静态局部变量、全局变量、静态全局变量这三者是存储在静态存储区的。
存储在静态存储区的变量直到程序结束才会销毁。也就是说,静态局部变量的生命周期是整个源程序。
但是此时它只是声明在代码块内,所以它的作用域是声明它的代码块。
作用:延长了局部变量的生命周期,为整个源程序
static修饰全局变量
一般当全局变量存储在静态存储区,直到程序结束才销毁。我们可以使用extern关键字来引用这个全局变量。
当全局变量使用static修饰时,其生命周期没有变,依旧是在程序结束时才销毁。但是其作用域变了,以前是整个源程序,现在只限于声明它的这个文件才可见,即使用extern引用也不行。
作用:改变了作用域,仅限于声明它的类文件内
----------------------extern--------------------
extern主要是用来引用全局变量,它的原理就是先在本文件中查找,本文件中查找不到再到其他文件中查找。
常把extern和const联合使用在项目中创建一个文件,这个文件文件中包含整个项目中都能访问的全局常量。
比如我们在项目中创建的这个文件为ZCConst.h,ZCConst.m。
屏幕快照 2018-11-16 下午12.49.47.png
屏幕快照 2018-11-16 下午12.50.05.png