- 第一次创建:启动
runloop
时 - 最后一次销毁:
runloop
退出时 - 其他时候的创建和销毁:当
runloop
即将进行休眠状态
时会销毁旧的释放池,并创建一个新的释放池。
- runloop就是iOS中的消息循环机制,当一个runloop结束时系统才会一次性清理掉被autorelease
处理过的对象
,其实本质上说是在本次runloop迭代结束
时清理掉被本次迭代期间被放到autorelease pool中的对象的。至于何时runloop结束并没有固定的duration!
- 当一个autorelease pool被
drain
的时候,会对pool里的每一个对象发送一个release消息;
- 每一个线程(包括主线程)都有一个AutoreleasePool栈。当一个新的池子被创建的时候,push进栈,当池子被释放内存时,pop出栈。对象调用autorelease方法进入栈顶池子中。当
线程结束
的时候,会自动地销毁所有跟它有关联的池子;
- 使用容器的block版本的枚举器时,内部会自动添加一个AutoreleasePool:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// 这里被一个局部@autoreleasepool包围着
}];
在普通for
循环和for in
循环中没有,当for循环中便利产生大量autorelease
变量时,就需要手动加局部AutoreleasePool
。
什么时候用AutoreleasePool
:
- 写给予命令行的程序时,就是没有UI框架;
- 写循环,循环里边包含了大量临时创建的对象;
- 创建了新的线程;
- 长时间在后台运行的任务;
- 合理运用自动释放池,可以降低程序的内存峰值,异步的方式将文件保存在磁盘(SDWebimage里边异步保存图片到磁盘,类似的占用内存的操作);
网友评论