美文网首页
iOS之const、extern、static用法

iOS之const、extern、static用法

作者: 无极战思 | 来源:发表于2020-10-19 21:01 被阅读0次

    static

    static分两种情况,修饰局部变量和全局变量。
    (1)修饰局部变量
    在整个程序运行的过程中局部变量只初始化一次,只有一份内存,作用域是该方法代码块内。

    #import "ViewController.h"
    #import "NetManger.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
    [super viewDidLoad];
        for(int i = 0;i<5;i++)
           {
               [self isNotStatic];
               [self isStatic];
           }
    // Do any additional setup after loading the view.
    }
    -(void)isNotStatic
    {
       int i  = 0;
        I++;
       NSLog(@"i====%d",i);
    }
    -(void)isStatic
    {
      static int j  = 0;
        j++;
       NSLog(@"j====%d",j);
    }
    
    @end
    

    控制台输出结果如下:

       2020-10-19 20:25:06.755165+0800 id[2308:41315] i====1
       2020-10-19 20:25:06.755291+0800 id[2308:41315] j====1
       2020-10-19 20:25:06.755418+0800 id[2308:41315] i====1
       2020-10-19 20:25:06.755501+0800 id[2308:41315] j====2
       2020-10-19 20:25:06.755748+0800 id[2308:41315] i====1
       2020-10-19 20:25:06.755860+0800 id[2308:41315] j====3
       2020-10-19 20:25:06.756092+0800 id[2308:41315] i====1
       2020-10-19 20:25:06.756172+0800 id[2308:41315] j====4
       2020-10-19 20:25:06.756301+0800 id[2308:41315] i====1
       2020-10-19 20:25:06.756495+0800 id[2308:41315] j====5
    

    从输出结果看出,i一直是1,而j每次都增加1
    isNotStatic方法中,每次都重新初始化一个全新的局部变量i,执行++后变为1,出了该方法即作用域后被释放回收,所以每次打印都是1.而在isStatic方法中,由于局部变量j被关键字static修饰,让局部变量只初始化一次,内存也只有一份(静态存储区),在整个app运行期间都不会被释放回收。
    (2)修饰全局变量
    作用域:仅限于当前文件内部,外部文件无法访问,说白了就是在一个类里面定义一个static全局变量,其他类无法访问的。

    [图片上传中...(全局变量被static修饰.GIF-94609f-1603112958775-0)]

    全局变量使用static修饰后,生命周期没有变,依旧是程序结束才销毁。但是作用域变了,以前是整个源程序,现在只限于申明它的这个文件才能用,即使用extern引用也不行,如下

    全局变量被static修饰.GIF

    const作用:限制类型
    (1)const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)
    (2)被const修饰的变量是只读的
    举例如下:

      //定义变量
        int  a = 10;
        //允许修改值
        a = 20;
        
        /*
         const两种用法,修饰基本变量和指针变量
         */
        //1.修饰基本变量,下面两种写法等价
        const int b = 20;//b:只读变量
        int const bb = 20;//c:只读变量
        //2.修饰指针变量*p,带*的变量,就是指针变量
        //定义一个指向int类型的指针变量,指向a的地址
        
        int *p = &a;
        int c = 10;
        p = &c;
        //允许修改p指向的地址,
        //允许修改p访问内存空间的值
        *p=30;
        //const修饰指针变量访问的内存空间,修饰的是右边的*p1
        //两种方式等价
        const int *p1;//*p1:常量,p1:变量
        int const *p11;//*p11:常量,p11:变量
        //const修饰指针变量p1
        int *const p111;//*p111:变量 p111:常量
         // 第一个const修饰*p1 第二个const修饰 p1
    
       // 两种方式一样
        const int * const p2; // *p2:常量 p2:常量
        int const * const p22;  // *p2:常量 p2:常量 
    

    归纳为下面四种情况:

      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变量。

    const开发使用场景:

    • 当一个方法参数只读

    • 定义只读全局变量

        #import "ViewController.h"
        #import "NetManger.h"
        @interface ViewController ()
      
        @end
      
        @implementation ViewController
        NSString *const globalVar = @"123";
      
        - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        }
      // 当一个方法的参数,只读.
      
        - (void)constTestWithStr:(NSString * const)name
      
        {
      
        }
        // 指针只读,不能通过指针修改值
        - (void)constTestWithIntPointer:(int const *)a{
      
            //*a = 10;错误写法
      
        }
       // 基本数据类型只读
        - (void)constTestWithInt:(int const)a{
          }
      
        @end
      

    相关文章

      网友评论

          本文标题:iOS之const、extern、static用法

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