• iOS 中 const static extern 关键字总结


    在看一些高手所写的代码时,总是可以看到我们小白平常不用的关键字,一次,两次,三次,不能总是不明不白,现在总结一下日常开发中常用的关键字的作用:

    关键字const/static/extern的释义和用法

    1. const

    这个单词翻译成中文就是 “常量”的意思。在程序中我们知道常量的值是不能变的,固定的。所以const关键字的作用就是:

    (1) const用来修饰右边的基本变量或指针变量

    (2)被修饰的变量只读,不能被修改

    下面举一个简单的例子:

     //声明一个int类型的变量a 初始化值为10 并且a被const关键字修饰
            int const a = 10;
            //因为a被const修饰 所以变成只读 在做修改会报错
    //        a= 20;//(这句代码会报错)
            //上面的代码等价于
            //const int a = 10;
            NSLog(@"Hello, World!");

    在看一下下面的总结

    int  const  *p   //  *p只读 ;p变量
    int  * const  p  // *p变量 ; p只读
    const  int   * const p //p和*p都只读
    int  const  * const  p   //p和*p都只读

    注:判断p和p是只读还是变量 关键是看const在谁前面。如果只在p前面,那么p只读 *p还是变量; 如果在*p前面,p是变量 *p是只读。

    2.static

    这个单词翻译成中文是"静态"的意思,只从字面上理解是没有办法窥探他的作用的。下面我们直接先看他的作用:

    (1)修饰局部变量

    保证局部变量永远只初始化一次,在程序运行中永远只有一份内存,生命周期类似于全局变量了。但是作用域不变。这句话怎么理解呢 上个例子就明白了.

    随便建一个工程,在一个控制器类上监听控制器view的点击事件方法:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {    //声明一个局部变量i
        int i = 0;    //每次点击view来到这个方法时让i自增
        i ++;    //打印结果
        NSLog(@"i=%d",i);
    }

    输出日志如下:

    2016-10-26 14:58:48.290 fff[2760:170260] i=1
    2016-10-26 14:58:49.044 fff[2760:170260] i=1
    2016-10-26 14:58:49.200 fff[2760:170260] i=1....

    从输出日志中我们可以看到i一直等于1,这也是预料之中的,因为每次点击进入这个方法就会重新初始化一个全新的变量i = 0,加加了一次后值变为1,然后打印出结果为1,出了这个方法后局部变量i就被释放回收。所以每次打印出来的结果都为1。

    但是 我们再看看局部变量i被关键字static修饰后的情况:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {    //声明一个局部变量i
      static  int i = 0;    //每次点击view来到这个方法时让i自增
        i ++;    //打印结果
        NSLog(@"i=%d",i);
    }

    输出日志如下:

    2016-10-26 15:07:34.276 fff[2817:175155] i=1
    2016-10-26 15:07:35.347 fff[2817:175155] i=2
    2016-10-26 15:07:35.761 fff[2817:175155] i=3
    2016-10-26 15:07:36.057 fff[2817:175155] i=4
    2016-10-26 15:07:36.415 fff[2817:175155] i=5....

    从上面的日志中可以看出i的值一直在自增,什么?他难道不是每次进去都被初始化赋值为0了吗?怎么会累加呢?这就是关键字static修饰局部变量的作用,让局部变量永远只初始化一次,一份内存,生命周期已经跟全局变量类似了,只是作用域不变。

    (2)修饰全局变量

    使全局变量的作用域仅限于当前文件内部,即当前文件内部才能访问该全局变量。

    iOS中在一个文件中声明的全局变量,工程中的其它文件也是能访问的,但是我又不想让其它文件访问,这时就可以用static关键字来修饰它了,比较典型的使用是GCD一次性函数创建的单例,全局变量基本上都会使用static修饰。

    下面是一个使用GCD一次性函数创建的单例

    @implementation LoginTool
    //static修饰全局变量,让外界文件无法访问
    static LoginTool *_sharedManager = nil;
    
    + (LoginTool *)sharedManager {   
       static dispatch_once_t oncePredicate;   
       dispatch_once(&oncePredicate, ^{
            _sharedManager = [[self alloc] init];
        });   
       return _sharedManager;
    }

    (3)修饰函数

    static修饰函数的时候,被修饰的函数成为静态函数,使得外部文件无法访问这个函数,仅本文件可以访问。

    三 关键字:extern

    这个单词翻译过来就是"外面的","外部的"。顾名思义,他的作用就是声明外部局部变量。这里要注意的是 extern只能声明,不能用于实现。

    在开发中 我们经常会单独抽出来一个类来管理一些全局变量或者常量。下面我们来看看逼格比较高的一种做法:

    我们可以在.h文件中extern声明一些全局的变量

    //声明一些全局常量
    extern NSString * const name;
    extern NSInteger const count;

    然后在.m中去实现

    NSString * const name = @"王五";
    NSInteger const count = 3;

    这样,只要导入头文件,就可以全局的使用定义的变量或者常量。

    补充 使用const关键字 和 宏定义的区别

    一般我们把常用的字符串变量 抽成宏,但是苹果不建议我们抽成宏,推荐我们使用const常量。

    编译时刻:宏是预编译(编译之前提前处理) const 是编译阶段。

    编译检查:宏不做检查,不会编译报错,只是替换;const会编译检查,会报编译错误。

    宏的好处:宏能定义一些函数 方法;const 不能

    宏的坏处:使用大量宏 容易造成编译时间久,每次都需要重新替换。

  • 相关阅读:
    C语言学习019:函数指针
    C语言学习018:strdup复制字符串数组
    C语言学习017:malloc和free
    C语言学习016:单链表
    C语言学习015:联合(union)与枚举(enum)
    C语言学习014:结构化数据类型
    C语言学习013:通过make编译C源代码
    C语言学习012:将代码文件分成多个文件
    C语言学习011:带参数的main函数
    C语言学习010:fopen读写文件
  • 原文地址:https://www.cnblogs.com/huanying2000/p/6222028.html
Copyright © 2020-2023  润新知