正确使用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]; ...}; 万一你的编译器(错误地)不允许 ...
随机推荐
- cordova 入门
1. npm install -g cordova On Windows, npm can usually be found at C:\Users\username\AppData\Roaming\ ...
- linux 配置SSH网络传输数据安全方案,JDK,Tomcat和Eclipes
一.通过ssh实现安全远程访问linux系统 ssh :secure shell 加密: 1. 对称加密 (加密密钥与解密密钥相同) des .aes 2. 非对称加密(加密密钥与解密密钥不同) RS ...
- 查看Oracle的表中有哪些索引及其禁用索引
查看Oracle中表的索引是否存在 用user_indexes和user_ind_columns系统表查看已经存在的索引 对于系统中已经存在的索引我们可以通过以下的两个系统视图(user_indexe ...
- HDU2425:Hiking Trip(简单bfs,优先队列实现)
题目: 传送门 题意很简单就不解释了,水题一道. #include <iostream> #include <string.h> #include <stdio.h> ...
- bit,byte,char,位,字节,字符 的区别
bit,byte,char,位,字节,字符 的区别 原创文章,未经作者允许,禁止转载!!!
- JDK环境变量配置目录jre,jvm
类路径 :CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar JDK的路径:JAVA_HOME = C:/Program F ...
- 定时任务之elastic-job概述
定时任务有哪些? Timer定时器 ScheduledExecutorService Spring自带的@Scheduled Quartz定时任务 当当elastic job定时任务 Quartz实现 ...
- 跨域问题-jsonp
前端同源策略并不会拦截静态资源请求,那么就将接口伪装成资源,然后后端配合返回一个前端预定义的方法调用,将返回值放入调用该函数的形参即可 <!DOCTYPE html> <html l ...
- JVM内存结构 JVM的类加载机制
JVM内存结构: 1.java虚拟机栈:存放的是对象的引用(指针)和局部变量 2.程序计数器:每个线程都有一个程序计数器,跟踪代码运行到哪个位置了 3.堆:对象.数组 4.方法区:字节流(字节码文件) ...
- Web前端学习笔记之jQuery基础
0x0 jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Aja ...