iOS常量(const)、enum以及宏(#define)
http://www.cocoachina.com/ios/20160530/16483.html
本文投稿文章,作者:SuperMario_Nil(简书)
前言:本文主要梳理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 ...
- NO.2: 尽量以const,enum,inline 替换 #define
1.首先#define 定义不重视作用域(scope),虽然可以#undef控制,但是不美观,还存在多次替换的问题,以及没有任何封装性. 2.const XXX_XX,保证其常量性以及可控的作用域,如 ...
- 条款2:尽量以const, enum, inline替换#define
原因: 1. 追踪困难,由于在编译期已经替换,在记号表中没有. 2. 由于编译期多处替换,可能导致目标代码体积稍大. 3. define没有作用域,如在类中定义一个常量不行. 做法: 可以用const ...
随机推荐
- STL与泛型编程-学习2-GeekBand
9, 容器 Deque 双向队列 和vector类似, 新增加: push_front 在头部插入一个元素 pop_front 在头部弹出一个元素 Deque和vector内存管理不同: 大块分配内存 ...
- 政务私有云盘系统建设的工具 – Mobox私有云盘
序言 这几年,智慧政务已经成为了政府行业IT建设发展的重要进程.传统办公方式信息传递速度慢.共享程度低.查询利用难,早已成为政府机关获取和利用信息的严重制约因素.建立文档分享共用机制,加强数据整合,避 ...
- 廖雪峰Java10加密与安全-3摘要算法-1MD5
1.摘要算法 1.1 摘要算法(哈希算法/Hash/数字指纹): 计算任意长度数据的摘要(固定长度) 相同的输入数据始终得到相同的输出 不同的输入尽量得到不同的输出 1.2 摘要算法目的: 验证数据和 ...
- php 怎样判断一段字符 有没有经过 urlencode 处理
有没有百分号 判断字符串 执行urldecode 之前和之后是否一致 一致就是没有经过urlencode 不一致就是经过urlencode的 自己方法:判断是否所有: if(strpos($cooki ...
- python初学小记
使用PyCharm向世界打招呼! print (“Hello world!”) 介绍自己的基本信息的方法 name = input("name:")age = int(input( ...
- 洛谷P3306 随机数生成器
题意:给你一个数列,a1 = x,ai = (A * ai-1 + B) % P,求第一个是t的是哪一项,或者永远不会有t. 解:循环节不会超过P.我们使用BSGS的思想,预处理从t开始跳√P步的,插 ...
- bootstrap--栅格系统布局
栅格布局使用例子: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...
- 华为 Mate8 Emui 5.0 安卓 7.0 root 记录
步骤: 0.备份手机全部资料 1.华为官网申请解锁码 (unlock password) http://emui.huawei.com/plugin/hwdownload/download 2.关闭手 ...
- 使用Jedis操作Redis-使用Java语言在客户端操作---hash类型
我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器. 所以该类型非常适合于存储值对象的信息.如Username.P ...
- FFT初步代码分析和逼近曲线
FFT:快速傅里叶变换 文章从两个方面来写,一个是FFT的基础知识,也就是将时域信号转换为频域信号,另一个是合成时域信号. 将时域信号转换为频域信号 代码来源于http://bigsec.net/b5 ...