1.extern
extern用于变量的声明,告诉编译器:已经存在一个全局变量,但是不在当前的编译单元内,需要连接的时候在其他编译单元中寻找。
2.static
修改变量作用域为当前编译单元,变量生命周期不变;
避免重复定义全局变量
2.2. 修饰局部变量 -
修改变量的生命周期为整个工程周期,变量作用域不变
3.const
const修饰右边的变量,用来限制变量为只读属性。
4.define
在程序的预编译阶段进行替换处理。
5. define与const
区别:
1.define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
2.define不做检查,不会报编译错误,只是替换。const会编译检查,会报编译错误
3.define在展开的时候才分配内存,展开几次分配几次内存。const在定义的时候会分配一次内存到静态区,使用时不重复分配
4.define可以定义一些简单的运算函数
6. static和const的联合使用
声明一个只读的静态变量
7. extern和const的联合使用
在多个文件中经常使用的同一个全局变量。
使用场景:
1、.h文件中声明
2、.m文件中赋值
image3、pch文件中导入头文件即可在整个项目中访问
在swift想实现一样的功能非常简单,只需要新建一个swift文件,定义常量即可。
image这里直接访问即可,都不用放到.pch文件中,因为默认权限是internal
public : 最大权限,可以在当前framework和其他framwork中访问;
internal : 默认权限,可以在当前framework中随意访问;
private : 私有权限,只能在当前文件中访问;
8、用第7条代替define
一般常量的话,都用extern const 来代替define。
因为一旦定义#define的方式,整个工程将被重新编译,这样带来的时间浪费可想而知
当然了很多情况还是代替不了的,一般定义常量的时候是应该使用这种方式来定义,不过也只是常量宏不被推荐,但是类函数宏用的还是很方便的,
const、#define的优缺点
编译器可以对const进行类型安全检查。而对#define只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
这种情况还可能出现以下错误
Sending 'const NSString *__strong' to parameter of type 'NSString *' discards qualifiers
原因是需要NSString*
的地方使用了const NSString*
解决办法就是
.h中 extern const NSString*
替换为extern NSString* const
.m中const NSString*
替换为 NSString* const
解释:前者相当于指针本身不可修改,后者表示指针指向的内容不可修改,两者的作用都是使字符串只可读不可写。
网友评论