美文网首页
iOS内存管理(一)

iOS内存管理(一)

作者: 我是卖报的小行家 | 来源:发表于2020-04-24 10:34 被阅读0次

先熟知一下基础知识点

一.首先内存分为5个区域:

1.栈

作用:存储局部变量,当其作用域执行完毕后,立即被系统回收

2.堆

作用:存储OC对象,手动申请的字节空间,需要手动free释放

3.BSS段

作用:存储未初始化的局部变量和静态变量,这些变量一旦被初始化后,就会在BSS段中被回收,从而转存到数据段中

4.数据段

作用:存储已经初始化的局部变量和静态变量和常量数据,当程序结束时被立即回收。

5.代码段

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

补充:

常量区:用来存储常量,字符串的,程序结束时候被系统回收

二.关于栈(stack)堆(heap)的详解

1.栈:先进后出 FILO 向低字节扩展的数据结构,栈的内存管理由编译器自动管理,不需要我们做处理。

栈的分配方式:

1).静态分配

静态分配由编译器完成,比如局部变量的分配。

2).动态分配

动态分配由alloc函数进行分配。栈的动态分配也是由编译器释放,不需要我们手动实现。一个线程会分配一个栈。

tips:非对象的基本类型都是存储在栈中。

```

int a;  char *b 全局静态变量 static char *c = ""

```

2.堆:堆是由程序员分配和释放,用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。当进程调用alloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用realse释放内存时,被释放的内存从堆中被剔除(堆被缩减),因为我们现在iOS基本都使用ARC来管理对象,所以不用我们程序员来管理,但是我们要知道这个对象存储的位置。

举个例子说明代码中的内存中各个区域

```

int number = 23;  //全局初始化区(数据段)

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

static NSString *groupName = @"Lakers";  //全局(静态初始化)区

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    int numbers; //栈

    NSString * player = @"James";//栈

    int  number = 23; //23在常量区,number在栈上。

    NSMutableArray * westSections = [NSMutableArray arrayWithCapacity:15];//分配而来的8字节的区域就在堆中,array在栈中,指向堆区的地址

    NSInteger totalTeams = [self getTotalTeams:15 eastTeams:15];

}

- (NSInteger)getTotalTeams:(NSInteger)westTeams eastTeams:(NSInteger)eastTeams{

    return westTeams + eastTeams;//westTeams和eastTeams 栈区

}

@end

```

相关文章

网友评论

      本文标题:iOS内存管理(一)

      本文链接:https://www.haomeiwen.com/subject/nesxwhtx.html