自动释放池什么时候释放?

AutoreleasePool
  • 第一次创建:启动runloop
  • 最后一次销毁:runloop退出时
  • 其他时候的创建和销毁:当runloop即将进行休眠状态时会销毁旧的释放池,并创建一个新的释放池。

如果在正常情况下,一般是超出其作用域就会立即释放
如果将临时变量加入了自动释放池会延迟释放,即在runloop休眠或者autoreleasepool 作用域之后释放

  • 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里边异步保存图片到磁盘,类似的占用内存的操作);

你可能感兴趣的:(自动释放池什么时候释放?)