一、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)多线程应用中被几个任务共享的变量
网友评论