iOS开发笔记本iOS技巧记录

OC中的 全局变量、局部变量、静态全局变量、静态局部变量

2017-06-25  本文已影响124人  silencemajority

将从存储方式生命周期(时间)作用域(空间) 三个维度来区分它们。

1 存储方式

2 进程的内存分区

RAMZones.png

3 全局变量 局部变量

C语言中的定义:全局变量是申明在函数之外的变量,局部变量是申明在函数内部,以及函数的形式参数的变量

#import "ViewController.h"

int age = 24;//全局初始化区(数据区)

NSString *name;//全局未初始化区(BSS区)

@implementation ViewController

- (void)viewDidLoad {
 
    [super viewDidLoad];

    int tmpAge;//栈
 
    NSString *number = @"123456"; //123456\0在常量区,*number在栈上。
    
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:1];//分配而来的8字节的区域就在堆中,*array在栈中,指向堆区的地址
    
    NSInteger total = [self getTotalNumber:1 number2:1];
}

- (NSInteger)getTotalNumber:(NSInteger)number1 number2:(NSInteger)number2{

    return number1 + number2;//number1和number2 栈区
}

@end

4 全局变量 静态全局变量

全局变量在第3部分已经说明,静态全局变量就是在全局变量的前面加上 static 关键字。
由 static 修饰的 静态全局变量和全局变量的存储方式生命周期是相同的。但是它们的作用域是不同的,全局变量在所有文件中都可以访问到,而静态全局变量只能在其申明的文件中才能访问到。也就是说,static改变了全局变量的作用域,从而达到对其他文件隐藏变量的目的,这是static的第一个作用。

#import "ViewController.h"

NSSting *name = @"jake"  //全局变量,在其他文件中通过 extern 关键字 可以访问到。

static NSSting *nikeNmae = @"jeek" //静态全局变量,只可以在本文件中访问到。

@implementation ViewController

- (void)viewDidLoad {
 
    [super viewDidLoad];
}

@end

5 局部变量 静态局部变量

局部变量在第3部分已经说明,静态局部变量就是在局部变量的前面加上 static 关键字。
由 static 修饰的 静态局部变量和局部变量的作用域是相同的。但是它们的存储方式是不同的,存储方式的不同导致了它们的生命周期也是不同的。 也就是说static改变了局部变量的存储方式,从而达到保存变量的目的,这是static的第二个作用。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
   
    [super viewDidLoad];

    for (int i = 0; i < 5; i++) {
        
        [self textC];
    }
}

- (void)textC{
    
    NSUInteger localInt = 0;  //局部变量 
    
    static NSUInteger staticLocalInt = 0;  //静态局部变量
    
    NSLog(@"局部变量 = %lu,静态局部变量 = %lu",(unsigned long)localInt,(unsigned long)staticLocalInt);
    
    localInt++;
    
    staticLocalInt++;
}

// 运行结果
2017-06-25 21:31:30.583 ARC-Learn[11825:712288] 局部变量 = 0,静态局部变量 = 0
2017-06-25 21:31:30.584 ARC-Learn[11825:712288] 局部变量 = 0,静态局部变量 = 1
2017-06-25 21:31:30.584 ARC-Learn[11825:712288] 局部变量 = 0,静态局部变量 = 2
2017-06-25 21:31:30.584 ARC-Learn[11825:712288] 局部变量 = 0,静态局部变量 = 3
2017-06-25 21:31:30.584 ARC-Learn[11825:712288] 局部变量 = 0,静态局部变量 = 4

//局部变量是动态存储方式,调用textc()时,localInt分配内存,调用结束时立即收回内存,下次调用在重新分配内存。所以数据是无法保存的。  
//静态局部变量是静态存储方式,程序开始运行时,staticLocalInt分配内存,只分配这一次内存,也就是说只初始化一次,textc调用结束时并不收回,而是等到程序结束时才收回。

6 总结

想要比较透彻的理解 全局变量、静态全局变量、局部变量、静态局部变量是什么,以及它们的区别,一定要了解

7 参考

本文参考了以下博客,向原作者表示感谢!同时本人水平有限,如有错误还请指出,不甚感激!

上一篇下一篇

猜你喜欢

热点阅读