我们开发常看到static关键字修饰变量,那么当变量被static关键字修饰的时候,会有什么变化呢?
static修饰局部变量
- (void)staticTest {
NSInteger i = 0;
i++;
static NSInteger n = 1;
n++;
NSLog(@"i = %ld, n = %ld", (long)i, (long)n);
NSLog(@"i地址: %p, n地址: %p", &i, &n);
}
将上述方法执行三次后,打印结果如下:
i = 1, m = 2
i地址: 0x7ffee6575138, n地址: 0x10968d508
i = 1, m = 3
i地址: 0x7ffee6574f78, n地址: 0x10968d508
i是一个局部变量,而n是一个用static修饰过的局部变量。每次调用staticTest方法的时候,i都是重新初始化,且打印的结果都是1,其内存地址也会发生变化。而用static修饰了的局部变量n却完全不同了,n只会初始化一次,且最终的打印结果是3,其内存地址也不会发生变化。
当用static修饰局部变量的时候,该局部变量只能初始化一次,在内存中的地址不变,并随着程序的结束而销毁掉(延长了局部变量的生命周期)。
static修饰全局变量
#import "ClassA.h"
// 声明一个全局变量
NSInteger num1;
static NSInteger num2;
@implementation ClassA
@end
#import "ClassB.h"
// 声明一个全局变量
NSInteger num1;
static NSInteger num2;
@implementation ClassA
@end
在两个类中定义两个相同的全局变量,num1是普通的全局变量,num2是被static修饰过的全局变量,当我们运行的时候会报错。
报错原因:num1全局变量重复定义,而用static修饰过的num2不会报这个错,这主要就是因为我们用static对num2进行了修饰,让它作用域只限在本类中,外部类无法访问该变量。
对于静态全局变量,如果该变量定义在.h文件中,那么外部类导入该.h文件, 仍然可以访问该全局变量,但也能创建一个同名的变量,且同名的变量有效。
static修饰全局变量之后,可让该全局变量的作用域只在本类中。
extern关键字
我们可以使用extern来访问全局变量。
extern NSInteger num1;
NSLog(@"%ld", num1);
num1 = 10;
NSLog(@"%ld", num1);
打印结果:1,10
我们在某个类中即时没有引入定义全局变量var1的文件也能访问该全局变量。
OC中的类方法类似于C中的static函数,在全局中只有一份。
网友评论