美文网首页
iOS - 关键字static、extern、const、vol

iOS - 关键字static、extern、const、vol

作者: 搬砖的crystal | 来源:发表于2023-02-09 09:54 被阅读0次

一、static

1.static 修饰局部变量

#import "ViewController.h"
@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    [self test];
    [self test];
    [self test];
    [self test];
}

-(void)test{
    static int a = 0;
    int b = 0;
    
    a++;
    b++;
    
    NSLog(@"a == %d b == %d",a,b);
}

@end

打印结果

2023-02-07 14:58:58.974491+0800 DJDemo[22628:1110458] a == 1 b == 1
2023-02-07 14:58:58.974667+0800 DJDemo[22628:1110458] a == 2 b == 1
2023-02-07 14:58:58.974850+0800 DJDemo[22628:1110458] a == 3 b == 1
2023-02-07 14:58:58.974996+0800 DJDemo[22628:1110458] a == 4 b == 1

当static关键字修饰局部变量时,只会初始化一次,在程序中永远只有一份内存,直到程序退出才会释放储存单元

当用 static 修饰局部变量时,变量被称为静态局部变量,和全局变量,静态全局变量一样,是存储在静态存储区。存储在静态存储区的变量,其内存直到程序结束才会被销毁。即,生命周期是整个源程序。

2.static 修饰全局变量

当全局变量没有使用 static 修饰时,其存储在静态存储区,直到程序结束才销毁。也就是其作用域是整个源程序。我们可以使用 extern 关键字来引用这个全局变量。
当全局变量使用 static 修饰时,其生命周期依旧是在程序结束时才销毁。但是其作用域只限于申明它的这个文件才可见。使用 extern 关键字无法引用这个全局变量。

3.函数体内

函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。

二、extern

主要是用来引用全局变量,它的原理是先在本文件中查找,查找不到再到其他文件中查找。

//.h中
@interface PDConst : NSObject

extern NSString *const appBaseURL;

@end
//.m中
@implementation PDConst

NSString *const currentBaseURL = @"http://192....";

@end

三、const

主要强调变量是不可修改的。
const 修饰的是其右边的值,也就是 const 右边的这个整体的值不能改变。

1.const* 前:

const 修饰 *str 这个整体,所以这个整体不能改变,这个整体是 str 指向的内存中的值。

//值不变
static NSString const *name = @"abc";
static const NSString *name = @"bac";   //两种写法等价

// name是 指针变量, *name是指针指向的变量的值
2.const* 后:

表示 str 指向的地址不能改变。

NSString * const str = @"abc";    // 地址不变

四、volatile

一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是 volatile 变量的几个例子:
(1)并行设备的硬件寄存器(如:状态寄存器)
(2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
(3)多线程应用中被几个任务共享的变量

相关文章

网友评论

      本文标题:iOS - 关键字static、extern、const、vol

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