全局变量和宏的使用的简单对比
- 1.全局变量存在的问题:使用变量时,值有可能会被修改,所有推荐使用const关键字修饰变量。
- 2.宏:宏定义的变量,不可被修改,但有时会产生很多临时的变量。
- 3.使用背景:
- 被const修饰的变量会变成常量,const一般用在函数参数的声明中。在编译时能确定值的情况,用const比宏合适。在运行时才能确定值的,不能用const,用宏合适。
- 例如:
// 1.在编译时能确定值的情况,用const比宏合适。例如:定义cell的tag标签时。
/* 全局变量,(全局,static只有一块内存空间、const不可变) */
static NSString * const LSLTagCellID = @"tag";
// 2.在运行时才能确定值的,不能用const,用宏合适。例如:当定义一个快速获取颜色的方法时,使用宏。
// 普通argb颜色
#define LSLARGBColor(a,r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)/255.0]
- 4.总结:一般能用const定义全局变量时尽量用const定义,最好少用宏定义,而且苹果也推荐使用const来定义全局变量。
全局变量的设置与static/const和extern的使用
-
1.const : const只修饰它右边的内容,被const修饰的内容都是常量、都是不能再修改的
-
实例:
int * const p1; p1是常量,*p1是变量 int const * p2; p2是变量,*p2是常量 const int * p3; p3是变量,*p3是常量 const int * const p4; p4是常量,*p4是常量 int const * const p5; p5是常量,*p5是常量
-
2.static :
- 1> 被static修饰的全局变量\常量
- 1) 仅限于当前文件访问
- 2) 改变了作用域
- 2> 被static修饰的局部变量
- 1) 只会占用一块内存,在整个程序运行过程都不会销毁,只会初始化一次
- 2) 改变了生命周期,并没有改变作用域
- 1> 被static修饰的全局变量\常量
-
3.extern : 可以引用一个全局变量\常量
-
4.使用规律:
- 1.如果只在文件中使用的用: static 类型 const 变量名 = 常量值;
- 2.如果是整个系统都能访问的变量,则:
- (1)在.m文件定义const常量: 类型 const 常量名 = 常量值;
- (2)在.h中: import "LSLConst.h" 和定义 UIKIT_EXTERN 类型const 常量名
- (3)在pch文件中导入.h文件中: import "LSLConst.h"
在公司项目中一般抽出单独的类来放全局变量/常量。
- 在LSLConst.h中
//
// LSLConst.h 定义所有的全局常量
//
#import <UIKit/UIKit.h>
/* 请求路劲 */
UIKIT_EXTERN NSString * const LSLRequestURL;
- 在LSLConst.m中
//
// LSLConst.m 定义所有的全局常量
//
#import <UIKit/UIKit.h>
/* 请求路劲 */
NSString * const LSLRequestURL = @"http://api.budejie.com/api/api_open.php";
- 在PrefixHeader.pch中导入
#import "LSLConst.h"
- 在项目中使用
// 发送请求:LSLRequestURL为请求路径;dict:为请求参数
[self.manager GET:LSLRequestURL parameters:dict success:^(NSURLSessionDataTask *task, id responseObject) {...}