extern
首先看代码示例:
GDGPerson.m 文件
#import "GDGPerson.h"
@implementation GDGPerson
int age = 10;
@end
main.m文件 ,不用包含GDGPerson类的头文件
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
extern int age;
age = 30;
NSLog(@" %d", age);
}
return 0;
}
在工程中新添加一个GDGPerson的类
在GDGPerson.m里写 int a = 10;
,在main.m里写 int a ;
,NSLog(@"%d",a);
打印会报错
因为无法引用外部变量
int a;
前加上extern,就可以打印出来,a的值是10
只要你在全局变量前加extern,你的这个文件就可以访问这个全局变量
首先清楚一点,默认条件下,全局变量的是整个程序都能访问的
记住! extern int a;
是并没有分配内存的,这样写不是定义变量
怎么写是定义变量?
int a;
这样写才是定义变量。
在main.m里怎么修改a 的值才不会报错?
这样写 a = 30;
打印出来的值a 是30
所以记住
任何情况下全局变量都是不安全的!为什么? 随时可能会被别人改掉。
总结:
<1>要想访问全局变量可以在前面加extern
<2>extern修饰的变量没有真正内存
static
1.修饰全局变量
GDGPerson.m文件
#import "GDGPerson.h"
@implementation GDGPerson
static int age = 10;
@end
main.m文件 不用包含GDGPerson类的头文件
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
extern int age;
NSLog(@" %d", age);
}
return 0;
}
那么我想我定义的全局变量只允许本文件访问,其他文件不能访问,怎么办?
简单,在int a = 10;
前加static
只要在全局变量前加static,那么这个全局变量的作用域就会缩小到当前文件,外界就不能访问了。
这时请在GDGPerson.m文件 int a = 10;
前加static,再运行程序,就会发现报错了
好处:保证全局变量安全,外界不可访问与修改
总结:static修饰全局变量,全局变量的作用域仅限于当前文件
2.修饰局部变量的作用
先看代码示例:
main.m文件
void test()
{
static int a = 0;
a++;
NSLog(@"a = %d", a);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
for (int i = 0; i<3; i++) {
test();
}
}
return 0;
}