参考了:某大神
目录:关键字const/static/extern的意思&&用法
a、const;
b、static;
c、extern;
d、static&&const配合使用
e、extern&&const配合使用
d、const&&宏定义
详解:
1、const :字符串常量。
作用:修饰右边的变量(基本类型变量 || 指针变量)
注:被const修饰的变量是只读的。
2、static:'静态'的意思。
作用:a、修饰局部变量(为了:1、延长生命周期;2、只会分配一次内存);
b、修饰全局变量(为了:修改作用域(防止重复声明全局变量而程序报错),只能在当前文件下使用。即只有在当前的文件内部才能访问的全局变量)。(最经典的是GCD单例模式)
static People(类名) *singleClass = nil;//声明全局变量,用static修饰让外界无法访问。
+ (People *) sharePeopele {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
singleClass = [[Peopele alloc]init];
})
return singleClass;
}
注:保证局部变量永远只初始化一次,在程序的运行过程中永远只有一份内存,生命周期类似全局变量,但是作用域不变。
3、extern:‘外部’的意思。
作用:只是用来声明外部全局变量,本身不能定义一个变量,只是用来声明。
工作原理:首先在当前文件中查找有没有全局变量。没有找到的话,就会去其他文件中查找。
4、static&&const配合使用
static&&const:声明了一个只读的静态变量。
要求:变量只读;只在当前文件下使用(非全局变量)
static NSString* const key =@"name";// 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。static修饰后表示只能本文件访问。
static NSString const *key1 =@"name";// 如果 const修饰 *key1,表示*key1只读,key1还是能改变。
注:一般用来修饰key。以便不被修改。
5、extern && const配合使用
背景:不同文件中经常使用同一个字符串常量,可以用extern&&const配合修饰。
根据背景可以得出:当每个文件都需要定义一份静态全局变量的情况下,只需要定义一份全局变量,多个文件可共享(用extern&&const修饰)
实战中经常新建一个全局变量文件来管理。(下边是偷用某大神的东西来理解下,希望不要打我^ - ^)。
// 在开发中,我们通常会单独抽一个类来管理一些全局的变量或常量,下面来看看【高逼格】的一种做法:
#ifdef __cplusplus
#define LNKIT_EXTERN extern"C"__attribute__((visibility ("default")))
#else
#define LNKIT_EXTERN extern __attribute__((visibility ("default")))
#endif
LNKIT_EXTERN大概就是将函数修饰为兼容以往C编译方式的、具有extern属性(文件外可见性)、public修饰的方法或变量库外仍可见的属性
extern NSString* const home_name;
//--------------------------- 发现 ------------------------------//
// 系统
UIKIT_EXTERN NSString* const discover_name;
//--------------------------- 圈子 ------------------------------//
// 高逼格
LNKIT_EXTERN NSString* const circle_name;
以上的声明变量在.h文件中声明,就可以全局使用定义的变量了。
6、const&&宏定义的区别
a、编译时刻:宏是预编译(编译之前处理);const是编译阶段;
b、编译检查:宏不做检查,不会报编译出错,只是替换;const会编译检查,会报编译错误;
c、宏的优势:宏能定义一些函数或者方法。const不能。
d、宏的弊端:使用大量的宏,会造成编译时间久,每次都需要重新替换。
所以一般推荐使用const常量来给定某UI的高度。不使用宏定义。