iOS中的static关键字
OC的static关键字
- OC也提供了Static关键字,但是这个static关键字不能用于修饰成员变量,也就是说Static是不被允许修饰实例变量,同时Static关键字也不被允许修饰方法。
- Static关键字可以修饰全局变量,局部变量。
- 被static修饰的全部变量或者局部变量都会存在于内存的静态区,最后由系统释放。此时这个变量就是静态全局变量
所谓静态局部变量和静态全局变量就是在全局变量和局部变量前面加上Static关键
全局变量
- 存储方式:静态存储,存储在全局(静态)区
- 生命周期:静态存储方式决定了其生命周期为 从程序开始运行到程序结束
- 作用域:该程序的所有文件。
静态全局变量
- 存储方式:静态存储,保存在全局静态区
- 生命周期: 从程序开始到程序运行结束
- 作用域: 只有声明了该变量的文件才能访问到
对于全局变量而言,Static改变了全局变量的作用域, 普通全局变量是在所有的文件里都可以访问到,但是Static修饰的全局变量只可以当前的文件里访问到
如此看来,static修饰地全局变量到达到了对于其他文件隐藏该全局变量的目的,这也就是Static的第一个作用
#import "Person.h"
NSSting *name = @"iOS" //全局变量,在其他文件中通过 extern 关键字 可以访问到。
static NSSting *nikeNmae = @"Lyt" //静态全局变量,只可以在本文件中访问到。
@implementation Person
@end
局部变量
- 存储方式:动态存储, 存储在堆(对象类型)或栈(数据类型)中
- 生命周期:动态存储方式决定了其生命周期为 变量使用期间
- 作用域:方法和函数内,确切的说从申明到遇到 ‘}‘ 为止。
静态局部变量
- 存储方式: 静态存储,存储在全局静态区
- 生命周期: 从程序开始到程序结束
- 作用域: 方法和函数内,从声明到函数截止
对于局部变量:由Static修饰的静态局部变量和普通局部变量的作用域是一样的,但是存储方式不同,导致了他们的生命周期也是不同的
这样的话,static改变了局部变量的存储方式,从而达到保存变量的目的,这是第二个作用
int main(int argc, const char * argv[]) {
@autoreleasepool {
int i = 0;
while (i < 5){
NSUInteger localInt = 0;
static NSUInteger staticLocalInt = 0;
NSLog(@"局部变量的值是 %lu, 静态局部变量 = %lu", localInt, staticLocalInt);
localInt++;
staticLocalInt++;
i++;
}
}
- 局部变量是动态存储方式,程序运行时候,localInt分配内存,调用结束时立即收回内存,下次调用在重新分配内存。所以数据是无法保存的。
- 静态局部变量是静态存储方式,程序开始运行时,staticLocalInt分配内存,只分配这一次内存,也就是说只初始化一次,程序调用结束时并不收回,而是等到程序结束时才收回。
总结
- 静态存储和动态存储
- 存储方式会决定变量的生命周期
- 静态存储的变量是加上Static关键字的全局变量和局部变量,它们存储在全局静态区域
- 全局变量、静态全局变量、静态局部变量采用静态存储方式,局部变量采用动态存储方式。
- 对于全局变量来说,static 改变了其作用域;对于局部变量来说,static改变了其存储方式,从而改变了生命周期。