extern
- extern置于變量或者函數(shù)前,作用域是整個工程,表示變量或者函數(shù)的定義在別的文件中,通過在變量前添加extern來訪問這個全局變量,
- extern修飾的變量沒有真正的內(nèi)存
#import "Person.h"
@implementation Person
int age = 10;
@end
在main.m文件中,不需要引入Person類的頭文件
int main(int argc, char * argv[]) {
@autoreleasepool {
extern int age; // 只要你在全局變量前加extern,你的這個文件就可以訪問這個全局變量
NSLog(@"age1=%d",age); // age1 = 10
age = 20; // 通過這種方法修改age值
NSLog(@"age2=%d",age); // age2 = 20
}
return 0;
}
static
- 只要在全局變量前加static,那么這個全局變量的作用域就會縮小到當前文件,外界就不能訪問了。
#import "Person.h"
@implementation Person
static int grade = 10;
@end
在main.m文件中,不引入Person類的頭文件
int main(int argc, char * argv[]) {
@autoreleasepool {
extern int grade;
NSLog(@"grade=%d",grade);
}
return 0;
}
編譯器直接報錯,

_grade在main中未定義
- static讓局部變量只初始化一次,不改變局部變量的作用域,僅僅改變了局部變量的生命周期(只到程序結(jié)束,這個局部變量才會銷毀)

用static修飾的局部變量

沒有用static修飾的局部變量