iOS 中的宏(define)和常量(const)

对于刚接触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没有什么区别

对于这叙述修饰位置的区别,大家可以自己用代码验证一下。可以帮助自己加深理解。

你可能感兴趣的:(iOS 中的宏(define)和常量(const))