ARC与@autoreleasepool的关系

ARC全称为Automatic Reference Counting,也就是编译器为我们自动添加retain/release/autorelease等语句,保证引用计数的正确性,而不需要我们自己添加,仅仅如此。ARC不代表像Java那样有GC做垃圾回收,所以本质上还是要“手动”管理内存的。

而@autoreleasepool 可以帮助我们自动回收内存。当@autoreleasepool结束的时候,被ARC自动标记过autorelease的对象都会被release掉,也就是会被释放掉。

有些人会有些疑问,不管是在MRC还是ARC环境下,对象retain count为0的时候,对象都会被释放,为什么我们还要使用@autoreleasepool呢,不是多此一举吗?正常情况下,一个被标记为“autorelease”的对象,在retain count为0的时候,要等到当前runloop结束的时候,才会被释放。而在当前runloop结束之前,可能会出现无数个等待被释放而没有被释放的对象,这时候内存占用率就会比较高。恰当的使用@autoreleasepool可以及时释放这些对象,降低内存的使用率。

根据Apple的文档,@autoreleasepool使用场景如下:

  1. 写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
  2. 写循环,循环里面包含了大量临时创建的对象。(本文的例子)
  3. 创建了新的线程。(非Cocoa程序创建线程时才需要)
  4. 长时间在后台运行的任务。

对于每一个Runloop(或者称为事件周期), 系统会隐式创建一个Autorelease pool(自然会有多个Autorelease pool),这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1 什么是自动引用计数 概念:在 LLVM 编译器中设置 ARC(Automaitc Reference Co...
    __silhouette阅读 5,246评论 1 17
  • 以下是关于内存管理的学习笔记:引用计数与ARC。iOS5以前自动引用计数(ARC)是在MacOS X 10.7与i...
    啊左阅读 4,598评论 0 17
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,008评论 1 16
  • 11.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什...
    AlanGe阅读 747评论 1 4
  • ✔班级: 【周六3:30--5:30。学员:曲冠明,郝嘉成。任课教师:李飞】 ✔教学目标:【设计并搭建手术室大门】...
    A越单纯越幸福阅读 505评论 0 0