「这是我参与2022初次更文挑战的第12天,活动详情查看:2022初次更文挑战」。

先熟知一下基础知识点

一.首要内存分为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