今天要说的是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里面。
网友评论