OC中的宏、static、const、宏


OC中externstaticconst和宏的一些用法区别,和使用场景

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-ifelse    与#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配合使用

staticconst组合:在每个文件都需要定义一份静态全局变量。
extern const 组合:只需要定义一份全局变量,多个文件共享。

提示:开发中便于管理所有的全局变量,通常搞一个Global文件,里面专门定义全局变量,统一管理,要不然项目文件太多不好找

当我们在一个防止一个变量被修改的时候,我们在前面加上 const
3、 extern 的高级使用 (模仿 YYKIT 的使用 ),其实它只是把苹果的宏拿过来改改名字,看起来很牛逼,我们也可以牛逼一下,如下:

苹果的定义:
UIKIT_EXTERN NSString *const refeshProjectAndClouldWorkList

欢迎大家关注 https://jackerchongchong.github.io ,提出您宝贵的意见

文章作者: 小小学生
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小学生 !
评论
  目录