「这是我参与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