I 全局常量
一. 宏和全局变量的优缺点
宏的优点
全局变量的优点
- 不会产生很多临时的空间,所有用到的地方都访问的统一个变量
宏的缺点
- 宏是直接替换的,它会产生许多个临时的存储空间来存储需要替换的部分,这样会浪费内存,没有必要
全局变量的缺点
二. 全局常量 - const关键字
1. const的特点
- 在编译阶段就要确定值是多少
- 综合了宏和全局变量的优点
- 被const修饰的变量会变成常量
- const写在类型前还是类型后都一样
- int const age = 20
- const int age = 20
- 因为const修饰右边,所以右边是哪个变量名字就修饰哪个变量
2. const和指针
- const只修饰右边内容,被const修饰的内容就是常量
- 右边是什么,就是常量
int * const p1;// p1是常量,*p1是变量
int const * p2;// *p2是常量, p2是变量
const int * p3;// *p3是常量,p3是变量
const int * const p4;//p4是常量,*p4是常量
int const * const p5;//p5是常量,*p5是常量
3. const和指针的应用
const int age = 20;
const int *p = &age; //int *p = &age;
*p = 30;// 因为age是常量,间接通过指针也不能修改age,是绝对安全的
注意
为了避免这种情况应该使用const int *p = &age;
三. const和宏的选用
- const是在编译阶段就要确定值是多少
- 需要执行某些方法的情况就不能用const,比如全局颜色定义宏
#define LNColorBg [UIColor redColor]
//需要调用UIColor这个类才能设置颜色
//而const是在编译阶段就已经确定了的,如果使用const来定义会报错
II 全局变量
一.全局变量的作用域
二.extern
- 利用extern,可以引用一个全局变量,可以在任何文件中访问这个全局变量,也能够修改
注意
全局变量的名字如果重复的话,会出现访问混乱,报重复定义的错误,所以全局变量的名字不能重复
补充:函数
- 默认函数也是能全世界都能访问的
- 只要利用extern引用一下就可以了,也不允许函数名重复
三.static,const和extern总结
1. static
- 被static修饰的
全局变量
,作用域仅限于当前文件
- 作用域改变(由全世界都能访问变为只在当前文件下才能访问)
- 生命周期不变(整个程序运行过程中只占一份内存且都不会被销毁)
- 被static修饰的
局部变量
,只会占用一块内存,在整个程序运行过程中都不会销毁,只会初始化一次
- 作用域不变(原来在什么作用域中还在什么作用域中)
- 生命周期改变(生命周期变长)
2. const
- const值修饰它右边的内容,被const修饰的内容都是常量,都不能再修改
3. extern
四.应用全局常量--Const.h/.m
全局常量的写法
-
- 仅限于本文件访问
- 在本文件中写下面的代码
- static 类型 const 常量名 = 常量值;
-
- 全世界都访问
- 在LNConst.m文件中
-
import <UIKit/UIKit.h>
- 类型 const 常量名 = 常量值;
- 在LNConst.m文件中
-
import <UIKit/UIKit.h>
- UIKIT_EXTERN 类型 const 常量名;
- 在pch文件中包含LNConst.h
注意
定义结构体(如CGRect)的时候想用全局常量可以使用大括号赋值{{,},{,}}