美文网首页
每天进步一点点2

每天进步一点点2

作者: IOS_Wek | 来源:发表于2018-07-26 16:23 被阅读9次

    今天要说的是AutoreleasePool 的数据结构

    其实AutoreleasePool 的本质是一个指向AutoreleasePage 双向链表的一个指针。

    1,AutoreleasePool 的初始化是怎么样的?
    例如@autoreleasePool {
    //做了什么1:
    void *atautoreleasepoolobj = objc_autoreleasePoolPush();
    创建了autoreleasePage节点,并进了一个“POOL_SENTINEL”进去page里面做哨兵
    //做了什么2
    objc_autoreleasePoolPop(atautoreleasepoolobj);
    释放哨兵之前的那些object
    }

    2,Autorelease 做了什么操作
    可以看到同样是调用了autoreleaseFast这个函数,这个函数做了什么?
    1,page有空闲地方,直接插入,更新栈顶
    2,page没有空闲,新建page,然后插入,
    3,没有page,新建page,然后插入。

    3,objc_autoreleasePoolPop(atautoreleasepoolobj); 做了什么?
    它就把哨兵前面的object全部都出栈。

    4,子线程和 autoreleasepool 的关系?

    这么回答吧:子线程和runloop是一一对应的,子线程开启了runloop之后,runloop 会维护一份自己的Autoreleasepool,所以子线程里面的autorelease的对象就会由这个autoreleasepool 去控制什么时候pop掉。
    如果子线程没有开启runloop呢?那么autorelease的对象怎么办呢?同样会添加到autoreleasePool结构里面的autoreleasePage里面。

    相关文章

      网友评论

          本文标题:每天进步一点点2

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