程序在运行中会占用内存,一般内存中分为堆区,栈区,代码区等那么Objective-C的内存分布又是什么样的呢?
内存分布
我们查看内存分布是我们可以通过打印内存地址比如说堆和栈,他们的内存地址相距就非常非常远,我们通过下面的图片来了解内存程序运行时内存的分布情况。
全局区:存放全局变量和常量
非初始化(bss):存放没有被初始化或初始化为0的全局变量;
初始化(data): 初始化过的全局变量数据,用来保存初始化了的非0的全局变量 ;
文字常量区(rodata):存放常量数据;
程序代码区(text):用来存放程序的代码(如函数)和部分整数常量是可以执行的不被共享;
栈区(stack):由系统自动分配,一般存放函数参数值、局部变量的值等。由编译器自动创建与释放;
堆区(heap):由程序创建和释放,相对自由一片区域,没有大小限制,采用链表形式管理;
查看下方代码查看分布情况
//代码为前辈所有
//main.cpp
int a = 0; // 全局初始化区
char *p1; // 全局未初始化区
main {
int b; // 栈
char s[] = "abc"; // 栈
char *p2; // 栈
char *p3 = "123456"; // 123456\0在常量区,p3在栈上
static int c =0; // 全局静态初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在堆区
strcpy(p1, "123456"); // 123456\0在常量区,这个函数的作用是将"123456" 这串字符串复制一份放在p1申请的10个字节的堆区域中。
// p3指向的"123456"与这里的"123456"可能会被编译器优化成一个地址。
}
上一篇中提到Block对应不同类型的Block,当然也存储在不同区域。堆中的内存需要我们手打创建和释放,相比较其他都是系统创建很释放。