美文网首页iOS基础知识
自动释放池的原理和本质

自动释放池的原理和本质

作者: 富城 | 来源:发表于2021-02-23 22:40 被阅读0次

自动释放池的原理和本质

什么是 autoreleasepool?

答:autoreleasepoolOC 的内存自动管理机制,它可以通过把不需要立即释放的对象通过栈的形式放到自动释放池中,当代码执行到释放池作用域结束,将池中的对象统一发送 release 消息,当对象的引用计数为零时,对象就被释放,内存被系统回收.

autoreleasepool 的本质其实也是一个对象,

struct __AtAutoreleasePool {
    //构造函数
    __AtAutoreleasePool() {
        atautoreleasepoolobj = objc_autoreleasePoolPush();
    }
    //析构函数
    ~__AtAutoreleasePool() {
        objc_autoreleasePoolPop(atautoreleasepoolobj);
    }
    // 结构体定义的对象
    void * atautoreleasepoolobj;
};

@autoreleasepool {}
//等价于
{__AtAutoreleasePool __autoreleasepool; }
  • __AtAutoreleasePool是一个结构体,有构造函数和析构函数

  • autoreleasepool在加入要释放的对象时,底层调用的是objc_autoreleasePoolPush方法

  • autoreleasepool在调用析构函数释放时,内部的实现是调用objc_autoreleasePoolPop方法

  • 栈为节点,通过双向链表构成

不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?(比如在一个vc的viewDidLoad中创建)

  • 分两种情况:手动干预释放时机、系统自动去释放

    • 手动干预释放时机:指定autoreleasepool就是所谓的:当前作用域大括号结束时就立即释放

    • 系统自动去释放:不手动指定autoreleasepoolAutorelease对象会在当前的 runloop 迭代结束时释放,下面详细说明释放时机

    • RunLoop中的三个状态会处理自动释放池,通过打印代码发现有两个Observer监听到状态值为:1和160(32+128)

      • kCFRunLoopEntry(1) // 第一次进入会创建一个自动释放池
      • kCFRunLoopBeforeWaiting(32) // 进入休眠状态前先销毁自动释放池,再创建一个新的自动释放池
      • kCFRunLoopExit(128) // 退出RunLoop时销毁最后一次创建的自动释放池
  • 在每一次runloop循环将要结束时,会对前一次创建的AutoreleasePool进行pop操作,同时会push进来一个新的AutoreleasePool,所以在viewDidLoad中所创建的array对象,是在当次runloop将要结束的时候,调用AutoreleasePoolPagepop方法中释放的

相关文章

  • 自动释放池的原理和本质

    自动释放池的原理和本质 什么是 autoreleasepool? 答:autoreleasepool 是 OC 的...

  • Objective-C内存篇(三) - Autorelease

    什么是自动释放池 自动释放,也是延迟释放。自动释放池的实现原理或者说作用:在自动释放池被销毁或耗尽时,会向池中的所...

  • autoReleasePool 原理

    (一)自动释放池的原理, 自动释放池是由多个autorelease page组成的双向链表,其中主要通过pus...

  • 复习总结3 自动释放池 & 优化

    自动释放池原理 Autorelease pool自动释放池,是OC的一种内存自动回收机制,可以将放入的临时变量统一...

  • iOS底层原理 - 内存管理 之 autorelease

    面试题引发的思考: Q: 自动释放池autoreleasepool底层原理介绍: 自动释放池的主要底层数据结构是:...

  • iOS内存管理4-autorelease自动释放池

    临时变量什么时候释放自动释放池的原理自动释放池能否嵌套使用 使用xcode创建一个project在创建的时候有会生...

  • 自动释放池原理

    1.什么是自动释放池 自动释放池(autorelease pool)是OC的一种内存自动回收机制。当你向一个对象发...

  • 自动释放池原理

    1.什么是自动释放池 自动释放池(autorelease pool)是一种内存自动回收机制。 当你向一个对象发送一...

  • iOS 内存管理--自动释放池底层原理

    前言 在内存管理的学习中自动释放池的原理学习是必须的,作为一个合格的iOS开发者,必须要明白自动释放池的操作原理,...

  • 内存优化

    一、自动释放池 自动释放池的主要结构体和类是:__AtAutoreleasePool、AutoreleasePoo...

网友评论

    本文标题:自动释放池的原理和本质

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