iOS

内存简单介绍

2019-03-13  本文已影响0人  DockeriOS

初步介绍

1.栈区

栈区(stack)由编译器自动分配并释放,存放的是函数的参数值,局部变量等,方法调用的实参也是保存在栈区的。

栈是系统数据结构,对应线程/进程是唯一的。优点是快速高效,缺点是有限制,数据不灵活。由编译器自动分配释放。主要存放一些基本类型的变量和对象引用类型。

2.堆区

由程序员分配和释放,如果程序员不释放,可能会出现内存泄露,程序结束的时候,可能会由操作系统回收,

比如iOS中alloc都是存放在堆中,优点是灵活方便,数据适应面广泛,但是效率有一定降低,堆空间的分配总是动态的,不同堆分配的内存无法互相操作。虽然程序结束的时候所有的数据空间都会被释放回系统,但是精确的申请内存,释放内存匹配是良好程序的基本要素。主要存放用new构造的对象和数组。

3.全局区(静态区)

全局变量和静态变量是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。

注意:全局区又可分为未初始化全局区:.bss段
     初始化全局区:data段。
     
举例:int a;为初始化的 int a = 10 ;已初始化的。

4.文字常量区

存放常量字符串,程序结束后由系统释放。

5.代码区

存放函数的二进制代码。

大致如图所示

avatar avatar
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;
}
上一篇 下一篇

猜你喜欢

热点阅读