关于#define 宏定义
之前的项目了使用的大量的宏定义,包含很多函数,各种常量等。没有做区分,反正就是把经常用到的内容一股脑都放在预处理的头文件当中了。
但其实这样的做法并不是合理的。这篇文章就总结一下如何规划项目中经常使用的代码。
#define 宏定义本质上是内容替换,编译器在编译的时候会把宏替换为宏定义的内容。对于项目中多个文件经常出现的代码,我们就可以用宏来处理。比如在进行页面布局时,要用到屏幕高度的代码:[[UIScreen mainScreen] bounds].size.height ,显然每个页面都写这行代码效率是比较低的,此处就可以使用宏定义:#define SCREEN_HEIGHT [[UIScreen mainScreen] bounds].size.height 。同理,获取系统版本号,返回系统定义的颜色,字体等代码,一些频繁使用的简单计算(比如颜色转换等),都可以使用宏定义。
那么,项目中经常使用的常量,到底要不要使用宏定义呢?
严格意义上说,宏定义定义的“常量”不能算作常量的,实际上它连数据的类型都不能指定,也不做类型检查。并且,还有覆盖同名称的宏定义的危险。如果是项目是你一个人开发的,你能保证不会乱修改宏定义,使用宏定义定义“常量”也能说得过去。但如果项目是多人协作的,建议使用另外一种方法定义常量比较合适。即使用extern和const 关键字修饰各种类型的常量,确保常量值不会被修改。并且这种做法也是官方推荐的。
举个例子,定义一个重新登录的通知,使用宏定义会这样做:#define RELOGIN_NOTIFICATION @"reLoginNotification";使用const这样做
NSString * const RELOGIN_NOTIFICATION=@"reLoginNotification"; 使用const能确保常量的值不会被修改,并且有类型检查,相对安全些。
结论:对于项目中频繁出现的代码,为提高效率,减少出错机会,合适的做法是这样:
1.使用预处理文件,把要频繁导入的头文件管理起来(包括下面创建的头文件)。
2.创建头文件,把经常用到的代码,使用#define,写在头文件中。
3.在头文件中,用extern定义各种常量。在实现文件中,对常量进行赋值。
网友评论