Skip to content

iOS — 正确使用修饰符const、宏定义 #13

Open

Description

@cssoul

在iOS开发中随着项目工程的逐渐增大,过多的宏定义可能影响项目的编译速度。所以苹果推荐我们使用修饰符 const,尽量少使用宏定义;

一、const与宏的区别

1、宏在编译开始之前就会被替换,而const是编译阶段;

2、宏可以定义一些函数方法,const不能;

3、宏编译时只替换不做检查不报错,也就是说有重复定义问题。而const会编译检查,会报错;

二、const作用及使用场景

1、const 用来修饰右边的变量(eg:基本数据变量p,指针变量*p)

2、被 const 修饰的变量是只读的

指针类型根据位置的不同可以理解成3种情况:

  • 常量指针

初始化之后不能赋值,指向的对象可以是任意对象,对象可变。

NSString * const pt1;

  • 指向常量的指针

初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改

const NSString * pt2;

  • 指向常量的常量指针

const NSString * const pt3;

三、const与static、extern联合使用
1、static 与 const

作用:iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量

场景:在一个文件中经常使用的字符串常量,可以使用static与const组合

static const int a = 20;

// 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改
static  NSString * const key = @"name";

// 如果 const修饰 *key1,表示*key1只读,key1还是能改变
static  NSString const *key1 = @"name";
2、 extern 与 const

场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合。

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

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

//GlobeConst.h

extern NSString * const nameKey = @"name";


//GlobeConst.m

NSString * const nameKey = @"name";
四、那到底什么时候使用宏、const?

定义全局变量的时候,我们应该尽量先考虑使用 static 方式声名const来替代使用宏定义。const不能满足的情况再考虑使用宏定义。比如用以下定义:

static NSString * const CLASSNAMEconst = @"Hello";
static const CGFloat CLASSNAMEWidth = 10.0;

代替:

#define CLASSNAMEDEFINE @"Hello"
#define CLASSNAMEWIDTH 10.0

对于整型类型,代替宏定义直接定义整型常量比较好的办法是使用enum,使用enum时推荐使用NS_ENUM和NS_OPTIONS宏。比如用以下定义:

typedef NS_ENUM(NSInteger,TestEnum) {
      MY_INT_CONST = 12345
};

代替:

#define MY_INT_CONST 12345

NS_OPTIONS定义方式如下:

typedef NS_OPTIONS(NSInteger, SelectType) {
  SelectA    = 0,
  SelectB    = 1 << 0,
  SelectC    = 1 << 1,
  SelectD    = 1 << 2
};

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions