iOS之const、extern、static用法

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
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。