static
-
修饰局部变量
- 让局部变量只初始化一次
- 局部变量在程序中只有一份内存
- 并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁)
-
修饰全局变量
- 全局变量的作用域仅限于当前文件
const
-
没有const修饰的指针
-
指针p和*p都能被修改
// 定义一个指针变量 int *p = NULL; // 定义2个int类型的变量 int a = 10; int b = 30; // p指向a p = &a; *p = 20; // p指向b p = &b; *p = 40; NSLog(@"%d %d", a, b);
-
-
const修饰的*p
-
被const修饰的*p只能被赋值一次,以后不能赋值,否则编译器报错
// const修饰的*p const int *p = NULL; int const *p = null; *p = 20; // 编译器报错,不能修改*p的值
-
-
const修饰的p
-
被const修饰的p只能存一次地址,以后再也不能其它存地址了,否则编译器报错
// const修饰的指针变量p int * const p = NULL; int a = 20; p = &a; // 编译器报错,不能修改指针变量p
-
- const在声明字符串的用法
NSString * const ZMJName = @"jack";
static和const联合使用
- static将一个全局变量变成局部变量
- const将一个局部变量变成局部常量
// 定义了一个局部常量 static const CGFloat ZMJRed = 0.4; static const CGFloat ZMJGreen = 0.6; static const CGFloat ZMJBlue = 0.7;
static const 与 #define
- 使用static const修饰变量和宏定义的比较
- 相同点
- 都不能再被修改
- 一处修改,其它都改了
- 不同点
- static const修饰变量只有一份内存
- 宏定义,只是简单的替换,每次使用都需要创建一份内存
- 相同点
- 结论
- 使用static const修饰更加高效,在同一个文件内可以使用
static const
取代#define
- 使用static const修饰更加高效,在同一个文件内可以使用
// static const修饰变量只有一份内存
static const CGFloat ZMJRed = 0.4;
// 宏定义,只是用0.4替换ZMJRed,每次使用都需要创建一份内存
#define ZMJRed 0.4
const实际开发的应用
-
一般会先新建
ZMJConst.h
文件专门存放常量的引用// 引用某变量,如果没有使用const修饰,就不能直接在编译的时候就能检测是否修改了ZMJRed extern const CGFloat ZMJRed; extern NSString * const ZMJName;
- 可以模仿系统UIKIT_EXTERN来代替extern,逼格更高!
UIKIT_EXTERN const CGFloat ZMJRed; UIKIT_EXTERN NSString * const ZMJName;
- 可以模仿系统UIKIT_EXTERN来代替extern,逼格更高!
-
一般会新建
ZMJConst.m
文件专门存放static const修饰的变量,需要用的时候导入头文件就可以了。// 定义了整个程序都能访问的常量 const CGFloat ZMJRed = 0.4; NSString * const ZMJName = @"jack";
const 与 #define
- 之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量。
- 编译时刻:宏是预编译(编译之前处理),const是编译阶段。
- 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
- 宏的好处:宏能定义一些函数,方法。 const不能。
- 宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换。 注意:很多Blog都说使用宏,会消耗很多内存,我这验证并不会生成很多内存,宏定义的是常量,常量都放在常量区,只会生成一份内存。
static和extern
-
static作用
:-
修饰局部变量:
1.延长局部变量的生命周期,程序结束才会销毁。
2.局部变量只会生成一份内存,只会初始化一次。
3.改变局部变量的作用域。
-
修饰全局变量
1.只能在本文件中访问,修改全局变量的作用域,生命周期不会改
2.避免重复定义全局变量
-
extern作用
:- 只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
extern工作原理
:- 先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。
extern与const联合使用
- 开发中使用场景:在
多个文件中
经常使用的同一个字符串常量,可以使用extern与const组合。 - 原因:
- static与const组合:在每个文件都需要定义一份静态全局变量。
- extern与const组合:只需要定义一份全局变量,多个文件共享。
- 全局常量正规写法:开发中便于管理所有的全局变量,通常搞一个GlobeConst文件,里面专门定义全局变量,统一管理,要不然项目文件多不好找。