让我们先看一下他们的内存分部情况:
![](https://img.haomeiwen.com/i14771483/bde4394ae4691fe5.png)
1、代码区:用来存放函数的二进制代码,在运行时要防止被非法修改,只允许读取不允许操作
2、常量区:存储常量
3、静态区(0x1):(比如static声明的变量,在程序编译的时候分配内存,直到结束的时候才释放,内存中只会有一份)
数据区:存放程序静态分配的变量和全局变量
BSS:包含了程序中未初始化全局变量
4、堆(0x6):由程序员分配和释放,存放进程运行中被动态分配的内存段,可大可小,根据存储的多少来调节大小。调用alloc等分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用realse释放内存时,被释放的内存从堆中被踢除(堆被缩减),因为我们现在iOS基本都使用ARC来管理对象,所以不用我们程序员来管理,但是我们要知道这个对象存储的位置
5、栈(0x7):栈是由编译器自动分配并释放,用来存放函数括弧“{}”中定义的变量。当函数被调用时,函数带有的参数也会被压入发起调用的进程栈中,待到调用结束后,函数的返回值也回被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。可以把栈看成一个临时数据寄存、交换的内存区
int num = 1;//数据区(全局区/静态区)
NSString str;//BSS区(全局区/静态区)
static NSString str2 = @"string";//静态区(静态初始化区/全局区)
- (void)viewDidLoad {
[super viewDidLoad];
int age;//栈
NSString name = @"xiaoming";//栈
NSString number = @"123";//123在常量区,number在栈上
//分配而来的8字节的区域就在堆中(相当于alloc分配内存),array在栈中,指向堆区的地址
NSMutableArray *array = [NSMutableArray arrayWithCapacity:1];
}
参考地址:
https://blog.csdn.net/youngkehpu/article/details/56282885
网友评论