在开发中,也许我们会经常使用到宏定义,或者用const修饰一些数据类型,经常有开发者不知道怎么正确使用,导致项目中乱用宏定义与const修饰符。本篇主要介绍在开发中怎么正确使用const
与define(宏定义)
当我们想定义全局共用的一些数据时,比如通知名字,动画时长等等,我们可以用宏
、常量
、变量
:
宏:
// 注意后面不需要带符号
#define ScottDidLoginSuccess @"登陆成功"
变量:
// 注意后面一定要带符号
NSString *scottDidLoginSuccess = @"登陆成功";
常量:
// 四种写法
static const NSString *scottDidLoginSuccess = @"登陆成功";
const NSString *scottDidLoginSuccess = @"登陆成功";
NSString const *scottDidLoginSuccess = @"登陆成功";
NSString *const scottDidLoginSuccess = @"登陆成功";
那么问题来了,我们到底该如何选择呢?
让我来先将一下我对它们之间的理解吧:
Hello world
与world
两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整型、浮点型会有多分拷贝,但这些数写在指令中,占的只是代码片段而且,大量使用宏会导致二进制文件变大。const
修饰的位置设定能够修改,在编译阶段做类型检查。全局常量:不管你定义在任何文件夹,外部都能访问
const NSString *scottDidLoginSuccess = @"登陆成功";
局部常量:用static修饰后,不能供外界访问
static const NSString *scottDidLoginSuccess = @"登陆成功";
// 1.
const NSString *scottDidLoginSuccess = @"登陆成功";
// 2.
NSString const *scottDidLoginSuccess = @"登陆成功";
// 3.
NSString * const scottDidLoginSuccess = @"登陆成功";
咋一看,WTF,这不都张一样嘛,其实不一样,下面解释一下各代表什么
*scottDidLoginSuccess
不能被修改,scottDidLoginSuccess
能被修改*scottDidLoginSuccess
不能被修改,scottDidLoginSuccess
能被修改,也就是和第一种情况是一样的scottDidLoginSuccess
不能被修改,*scottDidLoginSuccess
能被修改。结论:const
右边的总不能被修改
所以我们一般定义一个常量又不想被修改,应该这样定义:
NSString *const scottDidLoginSuccess = @"登陆成功";
define
在预处理阶段进行替换,const
常量在编译阶段使用;define
不做类型检查,只进行替换,const
常量有数据类型,会执行类型检查;define
不能调试,const
常量可以调试;define
定义的常量在替换后运行过程中,会不断占用内存,而const
定义的常量存储在数据段,只有一份拷贝,效率更高;define
可以定义函数,const
不可以。原文:https://www.cnblogs.com/scott-mr/p/8947650.html