前言:
常量我们经常使用,合理使用const
关键字会让代码变得高大上点,下面是一步步的演变过程
建议先看一下之前写的一篇文章iOS不可错过的关键字
本文以简单的颜色值为例
最小白的做法
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 定义颜色值
UIColor *bgColor = [UIColor colorWithRed:0.1 green:0.2 blue:0.3 alpha:1.0];
self.view.backgroundColor = bgColor;
}
@end
上面的代码真是很不方便,因为修改很麻烦,如果该颜色值是共用的,在这里硬编码很不好。考虑利用 #define
改进一下
改进1
#define DWRed 0.4
#define DWGreen 0.6
#define DWBlue 0.7
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 定义颜色值
UIColor *bgColor = [UIColor colorWithRed:DWRed green:DWGreen blue:DWBlue alpha:1.0];
self.view.backgroundColor = bgColor;
}
这样就把颜色值取出去了,以后想改,就在#define
处改。但是用const
修饰会更好,用#define
会占有多份临时内存,用到一处,就临时占一份内存。也就是说上面临时占用了3份了内存。
改进2
const CGFloat DWRed = 0.4;
const CGFloat DWGreen = 0.6;
const CGFloat DWBlue = 0.7;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
const NSString * a = @"10";
CGFloat str = a;
// 定义颜色值
UIColor *bgColor = [UIColor colorWithRed:DWRed green:DWGreen blue:DWBlue alpha:1.0];
self.view.backgroundColor = bgColor;
}
const
只占用一份内存,且不允许修改,还会检查数据类型,如下列代码
const NSString * str = @"10";
#define str2 @"10"
CGFloat a = str; //检查数据类型,会报类型不对
a = str2; //不报错,即不检查数据类型,程序运行时才会报错
改进3
创建一个Empty
类名叫DWConst.h
用下面代码替代DWConst.h
的内容
#import <UIKit/UIKit.h>
UIKIT_EXTERN const CGFloat DWRed;
extern const CGFloat DWGreen;
extern const CGFloat DWGBlue;
extern NSString * const name;
在此,再说一下extern
的作用:它表示其他位置有该实例化的一个非extern
定义,它会去其他位置找DWRed
、DWGreen
的实例,而上面还有UIKIT_EXTERN
,这是苹果对extern
关键字的特殊处理,所以也可以用这个修饰。
再次创建一个Empty
类名叫DWConst.m
,实例化DWConst.h
中的常量
添加以下代码
#import <UIKit/UIKit.h>
const CGFloat DWRed = 0.4;
const CGFloat DWGreen = 0.4;
const CGFloat DWBlue = 0.4;
NSString * const name = @"Yao Ming";
回到ViewController.m
中,导入DWConst.h
,去掉原来的定义,改用DWConst.h
中的定义。
本文文件目录:
ViewController.m
#import "ViewController.h"
#import "DWConst.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 定义颜色值
UIColor *bgColor = [UIColor colorWithRed:DWRed green:DWGreen blue:DWBlue alpha:1.0];
self.view.backgroundColor = bgColor;
NSLog(@"%f, %f, %f, %@", DWRed, DWGreen, DWBlue, name);
// name = @"dd"; //DWGreen = 33; //编译时就会报错
}
@end
以后有什么程序经常使用的常量,可以到这个类直接修改。对比下,对比最小白做法,在每个类各自创建,各自修改,修进3做法要好得多?好了,本文到此结束。