内存管理相关

news/2024/7/20 14:04:20 标签: 内存管理, 数据结构与算法, runtime

1. 内存布局

  • stack:栈区,方法调用
  • heap:堆区,通过alloc等分配的对象
  • bss:未初始化的全局变量、静态变量
  • data:已初始化的全局变量等
  • text:程序代码段

2. 内存管理

1. 基础概念
  • TaggedPointer(小对象)

  • NONPOINTER_ISA

  • 散列表(引用计数表、弱引用表)

    • SideTables()结构
    • SideTable结构
  • 如何实现快速分流(定位SideTable)

    • SideTables本质是一张Hash表

    • 涉及到的数据结构

      • 自旋锁-Soinlock_t

        • 是“忙等”的锁
        • 适用于轻量访问
      • 引用计数表-RefcountMap

        • size_t
      • 弱引用表-weak_table_t

2. MRC与ARC
  • MRC-手动引用计数

  • ARC-自动引用计数

    • ARC是LLVM编译器和Runtime协作的结果
    • 禁止手动调用retain/release/retainCount/dealloc
    • 新增weak、strong属性关键字
  • 引用计数管理

    • alloc
      • 实现
        • 经过一系列调用,最终调用c函数的calloc
        • 此时并未设置引用计数为1
    • retain
      • 实现
        SideTable& table = SideTables()[this];
        size_t& refcntStorage = table.refcnts[this];
        refcntStorage += SIDE_TABLE_RC_ONE;
        复制代码
    • release
      • 实现
        SideTable& table = SideTables()[this];
        RefcountMap::iterator it = table.refcnts.find(this);
        it->second -= SIDE_TABLE_RC_ONE;
        复制代码
    • retainCount
      • 实现
        SideTable& table = SideTables()[this];
        size_t refcnt_result = 1;
        RefcountMap::iterator it = table.refcnts.find(this);
        refcnt_result += it->second >> SIDE_TABLE_RC_ONE;
        复制代码
    • dealloc
      • 实现流程
        • object_dispose()实现
          • objc_destructInstance()
            • clearDeallocating()
  • 弱引用管理

  • 自动释放池

    • 以栈为节点通过双向链表的形式组合
    • 和线程一一对应
    • 多层嵌套就是多次插入哨兵对象
// array的释放时机
- (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *array = [NSMutableArray array];
    NSLog(@"%@", arrar);
}
复制代码
在当次runloop将要结束的时候调用AutoreleasePoolPage::pop()
复制代码
  • 实现原理

    • AutoreleasePoolPage
    • AutoreleasePoolPage::pop
      • 根据传入的哨兵对象找到对应位置
      • 给上次push操作之后添加的对象以此发送release消息
      • 回退next指针到正确位置
3. 循环引用
  • 代理

  • Block

  • NSTimer

  • 大环引用

  • 解决

    • 主动避免
    • 在合适的时机断环
  • 方案

    • __weak
    • __block
      • MRC下,__block修饰对象不会增加引用计数,避免了循环引用
      • ARC下,__block修饰对象会被强引用,需要手动解环
    • __unsafe_unretained

3. Block

1. 什么是Block
  • 是将函数及其执行上下文封装起来的OC对象
2. 捕获变量

打印:12

  • 局部变量
    • 基本数据类型
      • 截获其值
    • 对象类型
      • 连同所有权修饰符一起截获
  • 静态局部变量
    • 以指针形式截获
  • 全局变量
    • 不截获
  • 静态全局变量
    • 不截获
3. __block修饰符

  • 对变量进行赋值

  • __block修饰的变量变成了对象

    • __forwarding
      • 不论在任何位置,都可以顺利访问同一个__block变量
  • blcok类型

    • _NSConcreteGlobalBlock - 全局
    • _NSConcreteStackBlock - 栈
    • _NSConcreteMallocBlock - 堆

4. block循环引用

转载于:https://juejin.im/post/5cd40fe9f265da036023cb2d


http://www.niftyadmin.cn/n/1213820.html

相关文章

二. python字典

一. 字典 字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改 字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key>value)对用冒号(:)分割,每个对之间用逗号(,)分割…

【译】理解this及call,apply和bind的用法

JavaScript中最容易被误解的一个方面是this关键字。在这篇文章中,将通过学习四个规则来确定此关键字引用的内容。隐式绑定,显式绑定,new绑定和window绑定。在介绍这些时,你还将学习一些其他令人困惑的JavaScript部分,例…

N3-按链表值从尾到头的顺序返回一个ArrayList。

题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。方法一: *单链表就地逆置并按序放入数组中 单链表就地逆置 *将头结点后面指向null 依次遍历单链表再以头插法插入链表中 *方法二: * 调用库函数 Arraylist 中add两个参数的…

ARM嵌入式开发板推荐

arm嵌入式主板具有低成本、高性能、低功耗的特点,是一个嵌入在设备里面做控制、数据处理使用的CPU板,承担着“大脑”的角色,主要是作为工控主板使用。短短几年,ARM嵌入式的异军突起,日益广阔。  ARM嵌入式正在成为带…

Ubuntu QQ等安装

2019独角兽企业重金招聘Python工程师标准>>> git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu.git install.sh QQ :http://mirrors.aliyun.com/deepin/pool/non-free/d/deepin.com.qq.im/ 微信:http://mirrors.aliyun.com/deepin/pool/non…

杜教的板子

拉格朗日插值: /// 注意mod&#xff0c;使用前须调用一次 polysum::init(int M); namespace polysum {#define rep(i,a,n) for (int ia;i<n;i)#define per(i,a,n) for (int in-1;i>a;i--)typedef long long ll;const ll mod1e97; /// 取模值ll powmod(ll a,ll b) {ll res…

装机教程

简单装机教程 一、用软件制作好u盘启动盘&#xff0c;恭喜您已经完成了&#xff01; 二、找一个ISO文件或GHO&#xff08;用来装系统的"系统镜像文件"&#xff09;&#xff0c;放在gho文件夹。 方法&#xff1a;可以百度一下“xp系统下载”或“win7系统下载”&#x…

用VS Code开发Vue应用

摘要&#xff1a; 0错误0警告应该是每个程序员最基本的要求。 原文&#xff1a;用vscode开发vue应用作者&#xff1a;张京Fundebug经授权转载&#xff0c;版权归原作者所有。 现在用VSCode开发Vue.js应用几乎已经是前端的标配了&#xff0c;但很多时候我们看到的代码混乱不堪&a…