iOS内存管理(一)
先熟知一下基础知识点
一.首先内存分为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
```