先说结论,下面再写用代码解释。
-
修饰局部变量
- 让局部变量只初始化一次
- 局部变量在程序中只有一份内存
- 并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁)
-
修饰全局变量
- 全局变量的作用于仅限于当前文件
修饰局部变量
写一个test方法,在main中调用3次
void test() {
int age = 0;
// static int age = 0; age++;
NSLog(@"%d", age);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
test();
test();
test();
}
return 0;
}
打印结果:
不用static修饰时:
2016-08-11 11:18:21.392 Static讲解[5800:133430] 1
2016-08-11 11:18:21.393 Static讲解[5800:133430] 1
2016-08-11 11:18:21.393 Static讲解[5800:133430] 1
使用static修饰时:
2016-08-11 11:19:35.966 Static讲解[5811:134281] 1
2016-08-11 11:19:35.967 Static讲解[5811:134281] 2
2016-08-11 11:19:35.967 Static讲解[5811:134281] 3
由此可见,不使用static修饰时,每次调用都会申请内存创建一个局部变量。使用static修饰后,只申请了一次内存,创建了一个局部变量,每次访问的都是这一个局部变量。age的作用域只在test方法内。
修饰全局变量
新建一个Car类,定义一个全部变量age
@interface Car : NSObject
@end
@implementation Car
int age = 10;
@end
在main.m中引用age变量
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
extern int age;
NSLog(@"%d", age);
age++;
NSLog(@"%d", age);
}
return 0;
}
打印如下:
2016-08-11 11:37:23.266 Static讲解[5905:143679] 10
2016-08-11 11:37:23.267 Static讲解[5905:143679] 11
我们看到第一次打印出了10,这说明Car中定义的全部变量在项目的任意地方都是可以被引用的,作用域是全部文件;第二次打印了11,说明Car中age可以被外部修改。
在Car类的age前面使用static修饰后再次运行
static int age = 10;
这次运行不了,出现错误了
Undefined symbols for architecture x86_64:
"_age", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
提示在main.m中找不到age的外部引用,也就是说static修饰后,age的作用域不再是全部文件,而是Car.m文件。
建议定义全局变量时,使用static修饰,避免引起没必要的错误。