内存管理、自动释放池

2020-09-09  本文已影响0人  Queen_BJ
内存布局

问题一 :Autoreleasepool是实现机制是什么?它是什么时候释放内部的对象的?它内部的数据结构是什么样的?当我提到哨兵对象时,会继续问哨兵对象的作用是什么,为什么要设计它?

编译器会将 @autoreleasepool {} 改写为:

void * ctx = objc_autoreleasePoolPush;
    {}
objc_autoreleasePoolPop(ctx);

Autoreleasepool的原理是一个双向列表,它会对加入其中的对象实现延迟释放。
当Autoreleasepool调用drain方法时会释放内部标记为autorelease的对象

Autoreleasepool数据结构
class AutoreleasePoolPage {
    magic_t const magic;
    id *next;
    pthread_t const thread;
    AutoreleasePoolPage * const parent;
    AutoreleasePoolPage *child;
    uint32_t const depth;
    uint32_t hiwat;
};

哨兵对象类似一个指针,指向自动释放池的栈顶位置,它的作用就是用于标记当前自动释放池需要释放内部对象时,释放到那个地方结束,每次入栈时它用于确定添加的位置,然后再次移动到栈顶。

Autoreleasepool详细内容 容易理解

Autoreleasepool底层原理

问题二 :哪些对象会放入到Autoreleasepool中?
有两种情况生成的对象会加入到autoreleasepool中:

上一篇 下一篇

猜你喜欢

热点阅读