前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OC底层探索21-内存五大区域OC底层探索21-内存五大区域

OC底层探索21-内存五大区域OC底层探索21-内存五大区域

作者头像
用户8893176
发布2021-08-09 11:08:12
4700
发布2021-08-09 11:08:12
举报
文章被收录于专栏:小黑娃Henry

iOS设备中,内存被人为的分成5大区域栈区、堆区、全局/静态区、常量区、代码区,所占内存都为系统分配的虚拟内存

布局结构如图:

1、栈区

  • 函数内部定义的局部变量和方法的参数(方法中默认参数:self、cmd),都存放在栈区;
  • 栈区的内存空间由系统管理,申明的变量过了作用域范围后内存便会自动释放;
  • 栈是一块连续的内存区域从高地址向低地址进行存储,遵循FILO先进后出原则。
  • iOS主线程栈大小是1MB
  • 方法的调用也是在栈中进行;
1.1 栈区特点
  • 优点:快速高效,开发人员无需关注其内存的释放;
  • 缺点:数据有限制且不够灵活(数据大小与生存期必须是确定的)。

2、堆区

  • 一般是由alloc、malloc等内存分配方式创建的变量;
  • 开发人员需要关注变量的生命周期。如果不及时释放,会造成内存泄漏,只有等程序结束时由系统统一回收;
  • 堆是不连续的内存区域,类似于链表结构(便于增删,不便于查询),遵循先进先出(FIFO)原则;
2.1 栈区特点
  • 优点:获得空间灵活,分配内存较大;
  • 缺点:容易造成碎片(链表结构);

3、全局/静态区

  • 该区域的变量是系统在程序编译时生成,退出时销毁。生命周期为整个程序运行期
  • BSS段:没有初始化的全局/静态变量存储在这个区域;
  • DATA段:用于存储已经初始化的全局/静态变量;

4、常量区

  • 该区域的变量是系统在程序编译时生成,退出时销毁。生命周期为整个程序运行期
  • 存放常量:整型、字符型,浮点,字符串等,用const进行修饰的变量;

5、代码区

  • 代码会被编译成二进制存进内存的代码区域;

验证

代码语言:javascript
复制
NSLog(@"字符串地址:%p",@"constq3123");
NSLog(@"常量地址:%p",&constStr);
static NSString *staticStrUn;
static NSString *staticStr = @"constq3123";
NSLog(@"静态变量地址:%p",&staticStr);
NSLog(@"未初始化静态变量地址:%p",&staticStr);
HRTest * test = [HRTest alloc];
NSLog(@"对象地址:%p",test);
NSLog(@"局部变量指针地址:%p",&test);
-(void)say{
    NSLog(@"方法参数self:%p",&self);
    NSLog(@"方法参数cmd:%p",&_cmd);
}

输出:

通过一些简单的方式进行验证。

区域验证
  • 借助MachOView可以窥探一二,对比地址发现代码区的地址是最小的;

一则面试题

问:define和const声明的变量有什么区别?

  • 相同点都是可以进行常量的定义;
  • 区别:
    1. define在预编译阶段进行代码的替换,每使用一个位置就需要进行一次内存的开辟;
    2. const声明的变量是存放在常量区,在编译阶段就生成了,所以只需要进行一次内存的开辟,后续使用直接返回内存地址,比较节省内存;
    3. define是可以进行代码段的注入;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/6/29 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、栈区
    • 1.1 栈区特点
    • 2、堆区
      • 2.1 栈区特点
      • 3、全局/静态区
      • 4、常量区
      • 5、代码区
      • 验证
        • 区域验证
        • 一则面试题
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档