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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值