先說結(jié)論垃帅,下面再寫用代碼解釋。
-
修飾局部變量
- 讓局部變量只初始化一次
- 局部變量在程序中只有一份內(nèi)存
- 并不會(huì)改變局部變量的作用域讥珍,僅僅是改變了局部變量的生命周期(只到程序結(jié)束徙融,這個(gè)局部變量才會(huì)銷毀)
-
修飾全局變量
- 全局變量的作用于僅限于當(dāng)前文件
修飾局部變量
寫一個(gè)test方法,在main中調(diào)用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;
}
打印結(jié)果:
不用static修飾時(shí):
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修飾時(shí):
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修飾時(shí)哭靖,每次調(diào)用都會(huì)申請(qǐng)內(nèi)存創(chuàng)建一個(gè)局部變量具垫。使用static修飾后,只申請(qǐng)了一次內(nèi)存试幽,創(chuàng)建了一個(gè)局部變量筝蚕,每次訪問的都是這一個(gè)局部變量。age的作用域只在test方法內(nèi)铺坞。
修飾全局變量
新建一個(gè)Car類起宽,定義一個(gè)全部變量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中定義的全部變量在項(xiàng)目的任意地方都是可以被引用的,作用域是全部文件;第二次打印了11济榨,說明Car中age可以被外部修改坯沪。
在Car類的age前面使用static修飾后再次運(yùn)行
static int age = 10;
這次運(yùn)行不了,出現(xiàn)錯(cuò)誤了
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文件。
建議定義全局變量時(shí)赴魁,使用static修飾卸奉,避免引起沒必要的錯(cuò)誤。