为了账号安全,请及时绑定邮箱和手机立即绑定

const extern 关键字的妙用

标签:
iOS 面试

前言:

常量我们经常使用,合理使用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
image.png

用下面代码替代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定义,它会去其他位置找DWRedDWGreen的实例,而上面还有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中的定义。



本文文件目录:
image.png

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做法要好得多?好了,本文到此结束。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
软件工程师
手记
粉丝
6445
获赞与收藏
781

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消