您的位置:首页 > 移动开发 > IOS开发

iOS之 深究extern,static的用法和作用

2016-07-22 13:18 295 查看

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;
}


修饰局部变量时,作用域仅限于test函数的大括号,其他地方都不顶用

test这个函数中如果不加static,那么a打印出来的结果永远是1

因为每当调用一次函数,就会定义一个新的变量

每次a的值都是零,加加后就是1

但是加上static后,含义就不一样了

再打印的结果就是1,2,3

因为被static修饰的变量只会初始化一次,永远都只有一份内存

所以当第一次调用test函数时

a有一个内存空间,并且值是0

第二次再调用test函数时由于int a被 static 修饰

所以不会再初始化新值

它会拿到之前的那份内存加加,就会变为1

以此类推,之后就会变为2,3

好处:保住所修饰变量的命,保证它不会挂

总结:

<1>让局部变量只初始化一次

<2>局部变量在程序中只有一份内存

<3>并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息