iOS内存管理(一)


theme: vuepress

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。

先熟知一下基础知识点

一.首先内存分为5个区域:

1.栈

作用:存储局部变量,当其作用域执行完毕后,立即被系统回收

2.堆

作用:存储OC对象,手动申请的字节空间,需要手动free释放

3.BSS段

作用:存储未初始化的局部变量和静态变量,这些变量一旦被初始化后,就会在BSS段中被回收,从而转存到数据段中

4.数据段

作用:存储已经初始化的局部变量和静态变量和常量数据,当程序结束时被立即回收。

5.代码段

作用:代码段是用来存放可执行文件的操作指令(存放函数的二进制代码),也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准读取操作,而不允许写入(修改)操作——它是不可写的,程序结束时候被系统回收。

补充:

常量区:用来存储常量,字符串的,程序结束时候被系统回收

二.关于栈(stack)堆(heap)的详解

1.栈:先进后出 FILO 向低字节扩展的数据结构,栈的内存管理由编译器自动管理,不需要我们做处理。

栈的分配方式:

1).静态分配

静态分配由编译器完成,比如局部变量的分配。

2).动态分配

动态分配由alloc函数进行分配。栈的动态分配也是由编译器释放,不需要我们手动实现。一个线程会分配一个栈。

tips:非对象的基本类型都是存储在栈中。

  1. int a; char *b 全局静态变量 static char *c = ""

2.堆:堆是由程序员分配和释放,用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。当进程调用alloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用realse释放内存时,被释放的内存从堆中被剔除(堆被缩减),因为我们现在iOS基本都使用ARC来管理对象,所以不用我们程序员来管理,但是我们要知道这个对象存储的位置。

举个例子说明代码中的内存中各个区域

  1. int number = 23; //全局初始化区(数据段)
  2. NSString *playerName; //全局未初始化区(BSS段)
  3. static NSString *groupName = @"Lakers"; //全局(静态初始化)区
  4. @implementation ViewController
  5. - (void)viewDidLoad {
  6. [super viewDidLoad];
  7. int numbers; //栈
  8. NSString * player = @"James";//栈
  9. int number = 23; //23在常量区,number在栈上。
  10. NSMutableArray * westSections = [NSMutableArray arrayWithCapacity:15];//分配而来的8字节的区域就在堆中,array在栈中,指向堆区的地址
  11. NSInteger totalTeams = [self getTotalTeams:15 eastTeams:15];
  12. }
  13. - (NSInteger)getTotalTeams:(NSInteger)westTeams eastTeams:(NSInteger)eastTeams{
  14. return westTeams + eastTeams;//westTeams和eastTeams 栈区
  15. }
  16. @end

文章标签:

原文连接:https://juejin.cn/post/7063763434013196324

相关推荐

Taro框架完美使用Axios

看完这篇,你也可以搞定有趣的动态曲线绘制

Codable保姆级攻略

iOS CarPlay|使用 CarPlay 为你的 App 提速

零基础教你Unity集成IOS原生本地推送

StoreKit2 实际接入时候的踩坑与解决实录

iOS:runloop 运行循环

第四届青训营阅读打卡活动来啦,奖品、规则全面升级,快来学习吧

支持SwiftUI!Swift版图片&视频浏览器-JFHeroBrowser上线啦

用 JavaScript 复原何同学B站头图、对前端构建工具的一些理解、弹幕的常规设计与实现 丨酱酱的下午茶第31期

现今 Swift 包中的二进制目标

[Android开发学iOS系列] 语言篇: Swift vs Kotlin

LeetCode - #125 验证回文串

通过Vue自定义指令实现前端埋点,我不写单元测试,被批了,利用噪声构建美妙的 CS,Kotlin协程-CoroutineScope丨酱酱的下午茶第30期

iOS 数据存储

iOS怎么用代码实现这样奇怪的动画

利用 UIScrollView 实现六棱柱图片浏览效果

iOS中为什么会有这么多锁呢?

免费ios开发流程和步骤教程

[LD]iOS二进制组件化与Protocol的潜在风险