正确使用iOS常量(const)、enum以及宏(#define)
前言:本文主要梳理iOS中如何使用常量、enum、宏,以及各自的使用场景。
重要的事情首先说:在iOS开发中请尽量多使用const、enum来代替宏定义(#define);随着项目工程的逐渐增大,过多的宏定义还可能影响项目的编译速度。
宏定义大家应该都不陌生,使用起来非常简单,首先我们先来看一下宏定义跟const的区别:
1.宏在编译开始之前就会被替换,而const只是变量进行修饰;
2.宏可以定义一些函数方法,const不能
3.宏编译时只替换不做检查不报错,也就是说有重复定义问题。而const会编译检查,会报错
那到底什么时候使用宏,什么时候该使用const?
定义全局变量的时候,我们应该尽量先考虑使用 static 方式声名const来替代使用宏定义。const不能满足的情况再考虑使用宏定义。比如用以下定义:
|
1
2
|
static NSString * const CLASSNAMEconst = @"Hello";static const CGFloat CLASSNAMEWidth = 10.0; |
代替:
|
1
2
|
#define CLASSNAMEDEFINE @"Hello"#define CLASSNAMEWIDTH 10.0 |
对于整型类型,代替宏定义直接定义整型常量比较好的办法是使用enum,使用enum时推荐使用NS_ENUM和NS_OPTIONS宏。比如用以下定义:
|
1
2
3
|
typedef NS_ENUM(NSInteger,TestEnum) { MY_INT_CONST = 12345}; |
代替:
|
1
|
#define MY_INT_CONST 12345 |
NS_OPTIONS定义方式如下:
|
1
2
3
4
5
6
|
typedef NS_OPTIONS(NSInteger, SelectType) { SelectA = 0, SelectB = 1 << 0, SelectC = 1 << 1, SelectD = 1 << 2}; |
下面顺便说一下const 的一些使用方式,主要说明这几种写法的区别:
|
1
2
3
4
5
|
const NSString *constString1 = @"I am a const NSString * string";NSString const *constString2 = @"I am a NSString const * string";static const NSString *staticConstString1 = @"I am a static const NSString * string";static NSString const *staticConstString2 = @"I am a static NSString const * string";NSString * const stringConst = @"I am a NSString * const string"; |
全局变量:
|
1
2
3
4
5
6
|
//全局变量,constString1地址不能修改,constString1值能修改const NSString *constString1 = @"I am a const NSString * string";//意义同上,无区别NSString const *constString2 = @"I am a NSString const * string";// stringConst 地址能修改,stringConst值不能修改NSString * const stringConst = @"I am a NSString * const string"; |
constString1 跟constString2 无区别,外部使用要配合extern字段如:

在ViewController.m中定义全局变量在TestViewController.m中使用需要使用
|
1
2
|
extern NSString *constString1;NSLog(@"constString1:%@\n",constString1); |
局部常量:
|
1
2
3
4
|
//作用域只在本文件中,在其他类中使用需引用定义的类static const NSString *staticConstString1 = @"I am a static const NSString * string";static NSString const *staticConstString2 = @"I am a static NSString const * string";//--------------------------- |
总结:宏定义能用const,enum替换的以后就少用宏定义吧,然后...两点半了,我也该洗洗去睡了。有任何问题或者指点请直接留言,欢迎拍砖~最后感谢你的时间~
正确使用iOS常量(const)、enum以及宏(#define)的更多相关文章
- 尽量用const,enum,inline代替define
在读<Effective C++>之前,我确实不知道const,enum,inline会和define扯上什么关系,看完感觉收获很大,记录之. define: 宏定义. 在编译预处理时,对 ...
- 条款02:尽量以const,enum,inline替换#define
目录 1. 总结 2. 使用const常量或enum替换宏常量 class外部的常量指针 class专属常量 1. 总结 对于单纯常量,最好以const常量或enum替换#define 对于宏代码段, ...
- 尽量多的以 const/enum/inline 替代 #define
前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这 ...
- 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
其实这个条款分成两部分介绍会比较好,第一部分是用const和enum替换不带参的宏,第二部分是用inline替换带参的宏. 第一部分:用const和enum替换不带参宏 宏定义#define发生在预编 ...
- 第一篇:尽量多的以 const/enum/inline 替代 #define
前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这 ...
- Book. Effective C++ item2-尽量使用const, enum, inline替换#define
##常规变量 c++里面的#define后面的定义部分,是不算代码的一部分的.所以如果你使用#define: #define ASPECT_RATIO 1.653 你希望这个代号ASPECT RATI ...
- const与预处理宏#define的区别
在c语言程序设计时,预处理器可以不受限制地建立宏并用它来替代值.因为预处理器只做一些文本替换,宏没有类型检测概念,也没有类型检测功能.所以预处理器的值替换会出现一些小的问题,出现的这些问题,在c++中 ...
- Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define
1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...
- Effective C++ -----条款02:尽量以const, enum, inline替换 #define
class GamePlayer{private: static const int NumTurns = 5; int scores[NumTurns]; ...}; 万一你的编译器(错误地)不允许 ...
随机推荐
- Mybatis框架学习总结-优化Mybatis配置文件中的配置
连接数据库的配置单独放在一个properties文件中 之前,是直接将数据库的连接配置信息卸载了Mybatis的conf.xml文件中,如下: <?xml version="1.0&q ...
- [转发]SPRING MVC3.2案例讲解--SPRING MVC3的@ResponseBody和ResponseEntity
在传统的开发过程中,我们的控制CONTROLL层通常需要转向一个JSP视图:但随着WEB2.0相关技术的崛起,我们很多时候只需要返回数据即可,而不是一个JSP页面. SPRING MVC3的@Resp ...
- sap 动态字段的使用
1.sap中的动态字段其实类似c#里面的指针,都是指向的地址. 只是写法不同,sap 中的field-symbols就是类似指针. , b TYPE i. FIELD-SYMBOLS <fs&g ...
- Spark应用日志级别设置
一. 日志效率原因 开发时,控制台输出一大堆日志信息,严重影响查看日志效率. 从控制台输出日志我们可以看出,应用程序是默认加载Spark-core包下面的log4j-defaults.proper ...
- 通俗了解IaaS,PaaS,SaaS,看这里就对了(转)
[IT168 评论]云服务已经被大众所熟知,但对于刚接触云计算的朋友来说,仍然是云里雾里的绕着,今天小编就为你解读一下云计算的几种服务模式,IaaS,PaaS,SaaS到底是什么…区别有哪些? 字正腔 ...
- 理解ASM的Extent
理解ASM的Extent 分类: Oracle 2017-04-14 10:19:44 ASM中分配空间的单位是AU,Extent包含1个或多个AU.在11g之前,1个Extent对应1个AU.而 ...
- extern,头文件和ifndif宏
转自:CSDN->fpmystar 用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字,如果我想引用一个全局变量或函数f(),我只要直接在源文件中包含#incl ...
- DataGird 相关
DataGird控件 DataGirdView 控件 DataGird类 他们之间是什么关系??????? DataGridView 控件是替换 DataGrid 控件的新控 ...
- By.Xpath快速定位页面元素常用方法
先看一看xpath的语法 我们将在下面的例子中使用这个 XML 文档. <?xml version="1.0" encoding="ISO-8859-1" ...
- nginx配置访问图片路径(windows)
简介 Nginx(("engine x")由俄罗斯的程序设计师Igor Sysoev所开发)是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.PO ...