OC中extern、static、const和宏的一些用法区别,和使用场景
1、宏
宏可以定义代码,用#define来声明。它可以定义一些常量,例如:
1.定义字符串:#define kSessionId @"kSessionId"
2.定义一些代码:#define GETTOKEN [[NSUserDefaults standardUserDefaults] stringForKey:KToken]
3、可以做一些判断如:
#define 定义一个预处理宏
#undef 取消宏的定义
#if 编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef 判断某个宏是否被定义(#define过), 若已定义, 执行随后的语句
#ifndef 与#ifdef相反, 判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
defined 与#if, #elif配合使用, 判断某个宏是否被定义
#pragma 说明编译器信息
#warning 显示编译警告信息
#error 显示编译错误信息
配置debug
1.在 "Target > Build Settings > Preprocessor Macros > Debug" 设置"DEBUG=1”。
2.之后在pch或工具类中就可以这么写了:
#ifdef DEBUG
(debug 模式下的配置)
#else
(release 模式下的配置)
#endif
宏定义的一些常量和代码一般执行的是替换,宏会在编译期被加载,所以如果宏定义过多,会影响编译的时间,所以定义一些常量,不应该在宏定义中去定义这些全局变量。那么应该用什么去定义呢,这里用到了extern
2、extern
如果要声明一个常量的字符串,例如声明一些接口地址、统一声明NSNotificationName等,用extern声明,
使用:在一个类的.h中声明:extern NSString *const refeshProjectAndClouldWorkList;
在.m文件中: NSString *const refeshProjectAndClouldWorkList = @"refeshProjectAndClouldWorkList"
使用,引入这个文件即可,也可以在需要用的地方,重新声明一下
extern工作原理:先会去当前文件下查找有没有对应全局变量,如果没有,才会去其他文件查找
3、static
1、被static修饰局部变量,延长生命周期,跟整个应用程序有关,程序结束才会销毁,如下:在一个类的里面打印下面的方法,只要程序不销毁, a 的值就不会被销毁,会一直保持最后一次给 a 赋的值
2、被 static 修饰局部变量,只会分配一次内存
3、程序一运行就会给static修饰变量分配内存
4、修饰全局变量,被static修饰全局变量,作用域会修改,也就是只能在当前文件下使用
4、const
1.仅仅只是用来修饰右边的变量(基本变量,指针变量,对象变量)
2.const修饰的变量只读,是(只读)变量
5、 extern 和const配合使用
static与const组合:在每个文件都需要定义一份静态全局变量。
extern 与 const 组合:只需要定义一份全局变量,多个文件共享。
提示:开发中便于管理所有的全局变量,通常搞一个Global文件,里面专门定义全局变量,统一管理,要不然项目文件太多不好找
当我们在一个防止一个变量被修改的时候,我们在前面加上 const
3、 extern 的高级使用 (模仿 YYKIT 的使用 ),其实它只是把苹果的宏拿过来改改名字,看起来很牛逼,我们也可以牛逼一下,如下:
苹果的定义:
UIKIT_EXTERN NSString *const refeshProjectAndClouldWorkList