美文网首页
Autorelease pool的懒加载特性

Autorelease pool的懒加载特性

作者: 7hriller | 来源:发表于2018-11-17 10:52 被阅读6次

之前跟同事讨论过一个问题:

开启子线程
是否会自动创建一个默认的自动释放池?

根据StackOverFlow这篇问答所讨论:

在当前线程第一次发送autorelease时,
会进行自动释放池的创建,
因而不会造成内存泄漏。

个人认为这个特性可以看做是自动释放池的懒加载
从源码处(版本:objc4-723)可论证一下:
在对一个对象发送autorelease消息时,运行时会调用以下c函数:

static inline id *autoreleaseFast(id obj)
    {
        AutoreleasePoolPage *page = hotPage();
        if (page && !page->full()) {
            return page->add(obj);
        } else if (page) {
            return autoreleaseFullPage(obj, page);
        } else {
            return autoreleaseNoPage(obj);
        }
    }

逻辑很清晰:

  1. 首先获取当前线程的hot page,即自动释放池页栈栈顶位置的那一页;
  2. 然后判断是否存在此hot page,若存在并当前页未满,则直接将该对象指针入池;
  3. 若存在并栈已满,则需要调用autoreleaseFullPage用于开辟新页并入池;
  4. 若不存在hot pageno page,在源码中注释为"No page" could mean no pool has been pushed or an empty placeholder pool has been pushed and has no contents yet),即当前线程还没有建立自动释放池或只有一个placeholder pool,则需要调用autoreleaseNoPage用于新建一个自动释放池页栈并入栈一页。

因此问答上讨论的逻辑应该是正确的,但如果子线程全程未使用任何autorelease对象的话,应该不会建立自动释放池。

相关文章

网友评论

      本文标题:Autorelease pool的懒加载特性

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