一.const
1>对于const,记住关键的一点,它只是修饰右边的变量.
例如:
- (void)viewDidLoad { [super viewDidLoad]; // const两种用法 // const:修饰基本变量p // 这两种写法是一样的,const只修饰右边的基本变量b const int b = 20; // b:只读变量 int const b = 20; // b:只读变量
// const修饰指针变量访问的内存空间,修饰的是右边*p1, // 两种方式一样 const int *p1; // *p1:常量 p1:变量 int const *p1; // *p1:常量 p1:变量
// const修饰指针变量p1 int * const p1; // *p1:变量 p1:常量
// 第一个const修饰*p1 第二个const修饰 p1 // 两种方式一样 const int * const p1; // *p1:常量 p1:常量 int const * const p1; // *p1:常量 p1:常量 }
2>对于const的应用场景
//如果我需要一个方法,参数是地址,只能通过地址获取值,不能修改地址 //*a 只读 不能修改*a - (void)test:(const int *)a{ a = 20; } //如果不能修改a的值,只能修改a访问的值 //a 只读 不能修改a - (void)test1:(int * const)a{ *a = 20; }
3>const和宏的区别
(1)宏是预编译执行,const是编译执行.
(2)宏不会做编译检查,它只是做替换,因此不会编译报错;const会编译检查,会编译报错.
(3)宏能定义方法或函数,const不能.
(4)大量使用宏会造成编译时间长久.
(5)注意:大量使用宏并不会消耗很多内存,宏定义的是常量,常量是存放在常量去,只生成一份内存,并不像有些人所说的会消耗很多内存!
二.static和extern
1>static作用:
(1)修饰局部变量
1)延长局部变量的声明周期,程序结束才销毁
2)局部变量只初始化一次,节省内存
3)改变作用域
(2)修饰全局变量
1)只能在本文件中访问,修改全局变量作用域,生命周期不改变
2)避免重复定义全局变量
2>extern作用:
(1)只是用来获取全局变量的值,不能用来定义变量
(2)工作原理是先在本文件中查找有没有全局变量,没有找到的话再去其他文件中查找.
三.static和const一起使用
1>防止重复声明全局变量
2>不希望同事无意中修改变量,只允许读取
3>声明一个静态的全局只读常量
四.extern与const一起使用
1>在多个文件中经常使用同一个字符串常量,用extern和const组合使用
2>一般建一个GlobeConst