美文网首页
iOS-内存管理

iOS-内存管理

作者: yangfei02821 | 来源:发表于2022-02-08 17:24 被阅读0次

iOS里的内存管理

一、引用计数的存储

在64bit中,引用计数可以直接存储在优化过的isa指针extra_rc,如果引用计数器过大无法存储在isa中,会将isa中的has_sidetable_rc赋值为1,将引用计数存储在SideTable类中,以一个散列表形式保存

inline uintptr_t 
objc_object::rootRetainCount()
{
    if (isTaggedPointer()) return (uintptr_t)this;

    sidetable_lock();
    isa_t bits = LoadExclusive(&isa.bits);
    ClearExclusive(&isa.bits);
    /*
    nonpointer
    0,代表普通的指针,存储着Class、Meta-Class对象的内存地址
    1,代表优化过,使用位域存储更多的信息
     */
    if (bits.nonpointer) {
        // 从extra_rc中取出引用计数
        uintptr_t rc = 1 + bits.extra_rc;
        // 如果has_sidetable_rc为1,再从sidetable中取出引用计数
        if (bits.has_sidetable_rc) {
            rc += sidetable_getExtraRC_nolock();
        }
        sidetable_unlock();
        return rc;
    }

    sidetable_unlock();
    return sidetable_retainCount();
}

二、weak指针的实现原理

弱引用存在哈希表中,销毁时取出当前对象的弱引用表,把弱引用都清除掉。
弱引用表和isa存储不下的引用计数,都存放在SideTable类中


image.png
image.png

三、自动释放池的本质

autoreleasepool本质:

1、autoreleasepool其实也是一个结构体__AtAutoreleasePool,里边有一个构造函数和一个析构函数,
在大括号开始的位置调用他的构造函数,atautoreleasepoolobj = objc_autoreleasePoolPush();
大括号结束的时候调用他的析构函数,objc_autoreleasePoolPop(atautoreleasepoolobj);
在大括号中,调用了autorelease的对象最终都是通过AutoreleasePoolPage对象来管理的。
2、 AutoreleasePoolPage的结构


image.png
  • 每个AutoreleasePoolPage对象占用4096字节内存,除了用来存放它内部的成员变量,剩下的空间用来存放autorelease对象的地址
  • 所有的AutoreleasePoolPage对象通过双向链表的形式连接在一起,成员变量parent指向的上一个对象,成员变量child指向下一个对象
  • 调用push方法会将一个POOL_BOUNDARY入栈,并且返回其存放的内存地址
  • 调用pop方法时传入一个POOL_BOUNDARY的内存地址,会从最后一个入栈的对象开始发送release消息,直到遇到这个POOL_BOUNDARY
  • 成员变量id *next是指向了下一个能存放autorelease对象地址的区域


    image

    3、嵌套使用


    嵌套使用
    嵌套使用结构(一页就够存储,不需要三页,为了方便)
    image.png

四、Runloop和Autorelease

Autorelease对象是在当前的runloop迭代结束时释放
当监听到进入runloop的时候,调用push函数
当休眠的时候,会将当前自动释放池pop,并且重新push
当退出runloop的时候,会调用pop函数

相关文章

  • iOS-归纳

    iOS内存分区,堆区 栈区等 内存管理 属性关键字、内存分区总结 iOS- 数据存储iOS开发数据库-FMDBiO...

  • iOS-内存管理分析(中)

    前言 iOS-内存管理分析(上)[https://www.jianshu.com/p/312a7e85aa85]一...

  • iOS-内存管理分析(下)

    前言 iOS-内存管理分析(上)[https://www.jianshu.com/p/312a7e85aa85]以...

  • 【iOS-内存管理】

    在iOS使用引用计数来管理OC对象的内存 一个新创建的OC对象的引用计数是1,当引用计数减为0,OC对象就会销毁,...

  • iOS-内存管理

    简述内存管理基本原则 之前:OC内存管理遵循“谁创建,谁释放,谁引用,谁管理”的机制,当创建或引用一个对象的时候,...

  • iOS-内存管理

    面试题 使用CADisplayLink、NSTimer有什么注意点? 介绍下内存的几大区域 讲一下你对 iOS 内...

  • iOS-内存管理

    前言 说到iOS的内存管理,大致应该分为以下几个方面: NSTaggedPointer 类型 alloc,reta...

  • IOS-内存管理

    内存布局 IOS的内存布局除了我们知道的内存五大区,还有内核区和保留区,我们知道虚拟内存分配了4GB的空间,前面3...

  • iOS-内存管理

    MRC 遵循谁申请,谁添加,谁就要去释放,需要手动的去管理内存的添加,释放 ARC 当你申请,添加对象后系统会帮你...

  • iOS-内存管理

    一.内存的五大区 栈区:编译器自动分配并释放,存放函数的参数值、局部变量、基本类型的变量或对象引用类型 堆区:由程...

网友评论

      本文标题:iOS-内存管理

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