内存管理相关

1. 内存布局

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

2. 内存管理

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

  • NONPOINTER_ISA


    image

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

    • SideTables()结构


      image
    • SideTable结构


      image
  • 如何实现快速分流(定位SideTable)

    • SideTables本质是一张Hash表

    • 涉及到的数据结构

      • 自旋锁-Soinlock_t

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


        image
        • size_t


          image
      • 弱引用表-weak_table_t


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


    image
  • 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()
  • 实现原理


    image

    image

    image
    • AutoreleasePoolPage


      image

      image

      image

      image

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


        image
3. 循环引用
  • 代理

  • Block

  • NSTimer


    image
  • 大环引用

  • 解决

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

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

3. Block

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

打印:12

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


    image

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


    image

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

    • _NSConcreteGlobalBlock - 全局
    • _NSConcreteStackBlock - 栈


      image

      image

      image
    • _NSConcreteMallocBlock - 堆
image

image
4. block循环引用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,601评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,367评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,249评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,539评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,967评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,929评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,098评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,825评论 0 207
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,609评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,796评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,282评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,603评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,277评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,159评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,959评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,079评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,874评论 2 277

推荐阅读更多精彩内容