iOS的内存分配

iOS中的内存大致可以分为代码区,全局/静态区,常量区,堆区,栈区。

1.代码区

代码段是用来存放可执行文件的操作指令(存放函数的二进制代码),也就是说是它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。

2.全局/静态区

全局/静态区存放的是静态变量,静态全局变量,以及全局变量。初始化的全局变量,静态变量,静态全局变量存放在同一区域,未初始化的变量存放在相邻的区域。程序结束后由系统释放。

3.常量区

常量区存放的就是字符串常量,int常量等这些常量。

4.栈区

这块区域是由编译器自动分配并释放的,栈区存放的是函数的参数及自动变量。栈是向低地址扩展的一块连续的内存区域。分配在栈上的变量,当函数的作用域结束,系统就会自动销毁变量。

5.堆区

堆区内存一般是由程序员自己分配并释放的。当我们使用alloc来分配内存时分配的内存就是在堆上。由于我们现在大部分都是使用ARC,所以现在堆区的分配和释放也基本不需要我们来管理。堆区是向高地址扩展的一块非连续区域。

下面通过代码来看一下内存的分配

int a = 1;//全局变量分配在全局/静态区

static int b = 2;//静态全局变量分配在全局/静态区

 

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    static int c = 3;//静态局部变量分配在全局/静态区

    int d = 4;//自动变量分配在栈区

    NSString *string = @"abcd";//string自动变量分配在栈区,后面的字符串常亮分配在常量区

    NSArray *array = [[NSArray alloc] init];//array自动变量分配在栈区,后面创建的oc对象分配在堆区,栈区的指针指向堆区的对象。

}

猜你喜欢

转载自www.cnblogs.com/huangzs/p/10492608.html