关键字static
- 两个概念:生命周期、作用域
生命周期
:这个变量能存活多久,它所占用的内存什么时候分配,什么时候收回。
作用域
:这个变量在什么区域是可见的,可以拿来用的。
static
分两种情况:修饰局部变量、修饰全局变量
1、static
修饰局部变量
局部变量:在函数/方法/代码块内声明的变量。它的生命周期、作用域都是在这个代码块内。
局部变量 存储在栈区(stack)
一旦出了这个代码块,存储局部变量的这个栈内存就会被回收,局部变量也就被销毁。
当用static
修饰局部变量时,变量被称为静态局部变量
,和全局变量,静态全局变量一样,是存储在‘静态存储区’。
存储在 静态存储区 的变量,其内存直到 程序结束 才会被销毁。
即,生命周期是整个源程序。
静态局部变量
的生命周期是整个源程序,但,作用域是声明它的代码块内。
2、static
修饰全局变量
当全局变量没有使用
static
修饰时
其存储在静态存储区,直到程序结束才销毁。也就是其作用域是整个源程序。
我们可以使用extern
关键字来引用这个全局变量。当全局变量使用
static
修饰时
其生命周期没有变,依旧是在程序结束时才销毁。但是其作用域变了。现在只限于申明它的这个文件才可见。
使用extern
关键字无法引用这个全局变量。
全局变量本来是在整个源程序的所有文件都可见,static
修饰后,改为只在申明自己的文件可见,即修改了作用域。
static int num; //仅本文件可见
@implementation
@end
关键字const
主要强调变量是不可修改的。
const修饰的是其右边的值,也就是const右边的这个整体的值不能改变。
static NSString const *name = @"abc";
static const NSString *name = @"bac"; //两种写法等价
// name是 指针变量, *name是 指针指向的变量的值
-
*
是指针指向符,主要看*
与const
的前后关系
NSString const *str = @"abc"; // 值不变
1、const
在*
前:
const
修饰*str
这个整体,所以这个整体不能改变,这个整体是str
指向的内存中的值
。
NSString * const str = @"abc"; // 地址不变
2、const
在*
后:
表示str
指向的地址
不能改变
关键字extern
主要是用来引用全局变量
,它的原理是先在本文件中查找,查找不到再到其他文件中查找。
.h中
@interface PDConst : NSObject
extern NSString *const appBaseURL;
@end
.m中
@implementation PDConst
NSString *const currentBaseURL = @"http://192....";
@end