美文网首页
iOS内存管理(一)

iOS内存管理(一)

作者: 我是卖报的小行家 | 来源:发表于2020-04-24 10:34 被阅读0次

    先熟知一下基础知识点

    一.首先内存分为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

    ```

    相关文章

      网友评论

          本文标题:iOS内存管理(一)

          本文链接:https://www.haomeiwen.com/subject/nesxwhtx.html