对于刚接触iOS开发的程序员来说, 对于宏和常量的使用都并不是很了解, 所以在项目中胡乱的用宏和const修饰,今天我就以宏和常量整理出一篇文章,让大家对宏和常量的理解和使用更加清晰一些。
如果你能分清下面的代码的区别,和使用,那么对于宏和常量的理解就已经很到位了。
#define XYName @"理清思路......"
NSString *XYName = @"理清思路......";
extern NSString *XYName;
extern const NSString *XYName;
static const NSString *XYName = @"理清思路.....";
const NSString *XYName = @"理清思路.....";
NSString const *XYName = @"理清思路.....";
NSString *const XYName = @"理清思路.....";
当我们想要全局通用一些数据时, 我们就可以使用宏,变量,常量。下面说一下他们的区别。
首先是宏:
只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整形、浮点型会有多份拷贝,但这些数写在指令中。占的只是代码段而已,大量用宏会导致二进制文件变大
变量:
共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查。
常量:
共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以根据const修饰的位置设定能否修改,在编译阶段会执行类型检查。
这些解释是我在看资料的时候看别人写的,写的很好,所以就直接拿过来用了,这些解释应该对大家的理解有所帮助,苹果的API使用const很多,所以多使用const。
常量的区分:
全局常量:无论你定义在哪个文件夹里,外部都可以访问的到。
NSString const *XYName = @"理清思路.....";
局部常量:用static修饰的为局部常量,修饰之后不提供外界访问。
static const NSString *XYName = @"理清思路.....";
那么const修饰的位置不同,又有什么区别呢?
1. const NSString *XYName = @"理清思路.....";
2. NSString const *XYName = @"理清思路.....";
3. NSString *const XYName = @"理清思路.....";
1. const NSString *XYName = @"理清思路.....";
*XYName 不能被修改 XYName可以被修改
2. NSString const *XYName = @"理清思路.....";
*XYName 不能被修改 XYName可以被修改
3. NSString *const XYName = @"理清思路.....";
*XYName可以被修改 XYName不能被修改
1、2没有什么区别
对于这叙述修饰位置的区别,大家可以自己用代码验证一下。可以帮助自己加深理解。