AutoreleasePool(自动释放池)是OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量release的时机。在正常情况下,创建的变量会在超出其作用域的时候release,但是如果将变量加入AutoreleasePool,那么release将延迟执行。
在没有使用@autoreleasepool的情况,autorelease对象是在当前的runloop迭代结束时释放。
每个runloop中都会创建一个 autoreleasepool 并在runloop迭代结束进行释放。
每个runloop中都会创建一个 autoreleasepool 并在runloop迭代结束进行释放。
autoreleasepool对应的线程存储了指向最新page(也就是最新添加autorelease对象的page)的指针。
在自动释放池中每一个AutoreleasePoolPage都是以双链表的形式连接起来的:
每当自动释放池调用objc_autoreleasePoolPush时都会把边界对象放进栈顶,然后返回边界对象,用于释放。
atautoreleasepoolobj = objc_autoreleasePoolPush();
atautoreleasepoolobj就是返回的边界对象
push就是压栈的操作,先加入边界对象然后添加A对象在边界对象之后,下一个B对象压入A对象之后,就像羽毛球筒放羽毛球一样
自动释放池释放是传入 push 返回的边界对象,objc_autoreleasePoolPop(atautoreleasepovolobj);,然后将边界对象指向的这一页 AutoreleasePoolPage 内的对象释放(从栈顶开始操作出栈,并向栈中的对象发送release消息,直到遇到第一个边界对象)
总结:
1.自动释放池是一个个 AutoreleasePoolPage 组成的,一个page是4096字节大小,每个 AutoreleasePoolPage 以双向链表连接起来形成一个自动释放池。
2.pop 时是传入边界对象,然后对page 中的对象发送release 的消息。
参考地址:
https://www.jianshu.com/p/cc3ee2909457
https://www.jianshu.com/p/1b66c4d47cd7
网友评论