面试题:AutoreleasePool什么时候释放
2021-05-13 本文已影响0人
常在士心
1、添加对象进入到自动释放池
2、当前有page并且没有满,则直接将对象入栈顶(page->add(obj))
3、将对象压入栈顶,然后将栈顶指针下移;
4、如果当前page已满,则调用autoreleaseShow
该过程主要分为两步:
1,page->releaseUntil(stop); //对自动释放池中对象调用objc_release()进行释放,对栈顶到POOL_SENTINEL之间的所有对象调用objc_release(),进行引用计数减1;
2,page->kill(); //清空page对象
注意函数中的注释:
// memory: delete empty children
// hysteresis: keep one empty child if this page is more than half full
// special case: delete everything for pop(0)
保持一个空的子page当当前page大于一半时(可能是为了马上要新建page节省开销)
当调用pop(0)时,会清理掉所有的page;
if (page->child) {
if (page->lessThanHalfFull()) {
page->child->kill(); //如果当前存放的对象少于一半全部删除
}
else if (page->child->child) {
page->child->child->kill();//存放对象多余一半,则保留一个子page,节省开销
}
}
objc_autoreleasePoolPush
objc_autoreleasePoolPop
AutoreleasePoolPage
Run Loop在每个事件循环结束后会去自动释放池将所有自动释放对象的引用计数减一,若引用计数变成了0,则会将对象真正销毁掉,回收内存。