美文网首页iOS DeveloperiOS点点滴滴
iOS知识总结(一):static,const和宏定义的区分

iOS知识总结(一):static,const和宏定义的区分

作者: 里克尔梅西 | 来源:发表于2018-01-12 17:15 被阅读195次

    static

    有时希望函数中局部变量的值在函数调用后不消失而继续保留原值,以便在下一次调用的时候该变量已经有值。这时就该指定该局部变量为静态变量,用static关键字进行声明。

    • 修饰局部变量

      • 让局部变量只初始化一次
      • 局部变量在程序中只有一份内存,其分配在静态存储区,该变量在整个程序执行期间不释放,其分配的控件始终存在。
      • 并不会改变局部变量的作用域,仅仅是改变了其生命周期(程序结束,局部变量销毁)
    • 修饰全局变量

      全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

      全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。

      这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

      static全局变量只初使化一次,防止在其他文件单元中被引用,单例中的static就是这种用法。

    const

    const是C/C++中的一个关键字(修饰符),const一般用来定义一个常量,既然叫做常量, 即以后再也不能修改其值。

    • 通常const常量有四种写法:
    static const NSString *str = @"666哈哈哈";
    const NSString * str = @"666哈哈哈";
    NSString const * str = @"666哈哈哈";
    NSString * const str = @"66哈哈哈";
    
    • const有条原则, 那就是他右边是什么, 什么就不可变, 如下
    WX20180112-161312.png
    • const的作用:限制类型

      1. const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)
      2. 被const修饰的变量是只读的
    • static和const联合使用
      作用:声明一个只读的全局静态变量,在iOS中把一个经常使用的字符串常量定义为全局只读静态变量,用来代替宏。

    • 实际开发中,一般会专门建一个类来存放常量。

    #define

    宏定义, 则是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换。

    • const与宏的相同点
      都可以定义常量

    • const与宏的不同点

      1. 编译器处理方式不同
        define是在预处理阶段展开的。
        const常量是在编译运行阶段使用的。

      2. 类型和安全检查不同
        define宏没有类型,不做任何的安全检查,仅仅是展开。
        const常量是有具体类型的,在编译阶段会执行类型的检查。

      3. 存储方式不同
        define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
        const常量会在内存中分配,但只有一份内存空间,就算项目中N处用到,也不会分配N块内存空间。

      4. 效率不同
        宏占的只是代码段而已,大量用宏会导致二进制文件变大。
        而编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高。

    所以在项目中定义常量,用const要比用宏好的多,但是宏有自己独特的作用:

    • 宏能定义函数
    • OC的单例模式用到宏
    • 宏还能根据传入的参数生成字符串

    总结

    在Objective-C中, 随处可见const常量, 所以大家应该大胆地使用const, 它会带给你大大的益处. 同时, 只要某个数据是定义之后永远都不需要也不能修改的, 请使用const!

    相关文章

      网友评论

        本文标题:iOS知识总结(一):static,const和宏定义的区分

        本文链接:https://www.haomeiwen.com/subject/iwttoxtx.html