一、临时变量什么时候释放?
答:
ARC环境,大括号结束时释放。
MRC环境,在主线程中,临时变量会在runloop
运行结束时释放。在非主线程中,临时变量会在线程退出
时释放。
二、自动释放池原理
答:
-
Autorelease pool
自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来统一回收释放。自动释放池本身销毁的时候,池子里面所有的对象都会做一次release
操作。 -
任何OC对象只要调用
autorelease
方法,就会把该对象放到离自己最近的自动释放池中(栈顶的释放池
)。 -
NSAutoreleasePool
就是用来做引用计数的管理工作的。autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一。 -
自动释放池的主要底层数据结构是:
__AtAutoreleasePool
析构函数和AutoreleasePoolPage
链表。调用了autorelease的对象最终由AutoreleasePoolPage
对象来管理 -
每一个
AutoreleasePoolPage
对象占用4094
字节内存,本身成员占用56
字节,剩下的空间用来存放autorelease对象的地址。所有的AutoreleasePoolPage对象通过双向链表
的形式连接在一起。 -
每执行
@autoreleasepool
底层对应执行objc_autoreleasePoolPush()
; 就会往AutoreleasePoolPage
添加POOL_BOUNDARY
,并返回POOL_BOUNDARY
所在AutoreleasePoolPage
的内存空间地址。 -
@autoreleasepool{}
大括号结束 内部创建的__AtAutoreleasePool
对象销毁,调用析构函数objc_autoreleasePoolPop(atautoreleasepoolobj)
; -
AutoreleasePoolPage
开始从后往前
遍历autorelease
对象调用release
方法直到objc_autoreleasePoolPop()
传入的POOL_BOUNDARY
地址为止
三、自动释放池能否嵌套使用?
答:
- MRC下,自动释放池中的对象何时释放主要取决于对象何时进行
autorelease
操作,也就是说具体看[对象 autorelease]
; - 对象的释放时间,看各自所在的
@autorelease{ }
的右半大括号在什么位置,当代码执行到那个位置,该对象就自动释放.
网友评论