常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量,使用宏定义过多的话,随着工程越来越大,编译速度会越来越慢。
define宏与const使用场景:
-
宏在开发中使用的场景:
1、定义常用字符串。
2、定义一段函数,方法。 -
const在开发中使用的场景:
1、定义全局只读参数,代替宏,减低编译速度。
2、方法中定义只读参数,不允许更改。
define宏定义和const常变量区别:
- 编译器处理方式不同
define:宏是在预编译阶段展开。
const:常量是编译运行阶段使用。
(2) 类型和安全检查不同
define:宏没有类型,不做任何类型检查,不会报编译错误,只是替换。
const :常量有具体的类型,在编译阶段会执行类型检查,会报编译错误。
(3) 存储方式不同
define:宏仅仅是展开,有多少地方使用,就替换多少次,不会分配内存。
const:常量会在内存中分配(可以是堆中也可以是栈中)。
程序在预处理阶段将用define定义的内容进行了替换,因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。const定义的常量,在程序运行时在常量表中,系统为它分配内存。
const常变量:
1、const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)
2、被const修饰的变量是只读的。
3、const作用:限制类型
const int *p1; // *p1:常量 p1:变量
int const *p2; // *p2:常量 p2:变量
// const修饰指针变量p1
int * const p3; // *p3:变量 p3:常量
// 第一个const修饰*p1 第二个const修饰 p1
// 两种方式一样
const int * const p4; // *p4:常量 p4:常量
int const * const p5; // *p5:常量 p5:常量
变量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查
常量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以根据const修饰的位置设定能否修改,在编译阶段会执行类型检查
补充说明:以上的类型常量替换宏的情况,只是适用于单个文件的情况。如果是多个文件共享的常量,苹果推荐的这样的方式
UserInfoModel.h
extern NSString *const USER_NAME_KEY;
UserInfoModel.m
NSString *const USER_NAME_KEY = @"XXXXX.userName";
static作用
修饰局部变量:
1.延长局部变量的生命周期,程序结束才会销毁。
2.局部变量只会生成一份内存,只会初始化一次。
修饰全局变量
1.只能在本文件中访问,修改全局变量的作用域,生命周期不会改。
2.避免重复定义全局变量
修饰局部变量
for (int i=0; i<10; i++) {
int a = 0;
a++;
NSLog(@"%d",a);
}
//输出结果为 :每次进入大括号内都会重新初始化 a 所以结果为 1。
加上static修饰
for (int i=0; i<10; i++) {
static int a = 0;
a++;
NSLog(@"%d",a);
}
//输出结果为:1 ~ 10;
原因:static修饰的变量,程序一运行就会分配一次内存,用static修饰的代码,
只会在程序一启动就会执行,以后就不会在执行,所以结果为1、2、3、...、9、10。
extern作用
声明一个变量,不能定义变量
注意:extern修饰的变量不能初始化,使用场景,一般用于声明全局变量。
static、extern与const联合使用
很多时候我们在开发中都要static和extern与const联合使用,在来看看static和extern
- static与const联合使用
开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合,声明一个在本文件中静态的全局只读常量。
static NSString * const key = @"name";
iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量。
-
extern与const联合使用
开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合。 -
extern与static使用区分:
1、static与const组合:在每个文件都需要定义一份静态全局变量。
2、extern与const组合:只需要定义一份全局变量,多个文件共享。
补充说明:开发中便于管理所有的全局变量,通常搞一个全局的文件,里面专门定义全局变量,统一管理,要不然项目文件多不好找。
网友评论