初步介绍
1.栈区
栈区(stack)由编译器自动分配并释放,存放的是函数的参数值,局部变量等,方法调用的实参也是保存在栈区的。
栈是系统数据结构,对应线程/进程是唯一的。优点是快速高效,缺点是有限制,数据不灵活。由编译器自动分配释放。主要存放一些基本类型的变量和对象引用类型。
2.堆区
由程序员分配和释放,如果程序员不释放,可能会出现内存泄露,程序结束的时候,可能会由操作系统回收,
比如iOS中alloc都是存放在堆中,优点是灵活方便,数据适应面广泛,但是效率有一定降低,堆空间的分配总是动态的,不同堆分配的内存无法互相操作。虽然程序结束的时候所有的数据空间都会被释放回系统,但是精确的申请内存,释放内存匹配是良好程序的基本要素。主要存放用new构造的对象和数组。
3.全局区(静态区)
全局变量和静态变量是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。
注意:全局区又可分为未初始化全局区:.bss段
初始化全局区:data段。
举例:int a;为初始化的 int a = 10 ;已初始化的。
4.文字常量区
存放常量字符串,程序结束后由系统释放。
5.代码区
存放函数的二进制代码。
大致如图所示


int a = 0; //全局初始化区
char *p1; //全局未初始化区
void main() {
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; / /123456{post.content}在常量区,p3在栈上
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10); //分配得来得10字节的区域在堆区
p2 = (char *)malloc(20); //分配得来得20字节的区域在堆区
strcpy(p1, "123456"); //123456{post.content}放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块
}
int main(int argc, const char * argv[]) {
// 局部变量是保存在栈区的
// 栈区变量出了作用域之后,就会被销毁
NSInteger i = 10;
NSLog(@"%zd", i);
// 局部变量是保存在栈区的
// 赋值语句右侧,使用 new 方法创建的对象是保存在堆区的
// xinge 变量中,记录的是堆区的地址
// 在 OC 中,有一个内存管理机制,叫做 `ARC`,可以自动管理 OC 代码创建对象的生命周期
// 因此,在开发 OC 程序的时候,程序员通常不需要考虑内存释放的工作
LJXPerson *xinge = [LJXPerson new];
NSLog(@"%@", xinge);
return 0;
}
网友评论