iOS技术专题

ARC与@autoreleasepool的关系

2016-07-05  本文已影响877人  dacheng

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。

上一篇下一篇

猜你喜欢

热点阅读