一、 概述
**autorelease 就是把 release 延后到 autorelease pool drain 的时候。**是 ARC 进行引用计数管理机制中的一部分,挺巧妙的。其它还有 weak 指针等都是为了管理好内存设计的机制。主要是可以用在非 alloc、copy、new等函数的返回值上面。可以对应解决的需求是这些函数内部 retain 了返回值,返回时不能 release,否则调用方再拿这个地址访问就会 BAD_ACCESS,也不能交给调用方去 release,因为没有约定,你一个普通函数的返回值,我也不知道你内部 retain了没有,该不该帮你 release 掉,所以就设计了这么一个 autorelease 机制,延后 release,先暂存起来,pool drain 的时候 relase。pool drain 要么是手动的 autorelease pool 作用域结束,要么是一个 runloop 结束。out parmater 也会 autorelase, 不要放到手动 autorelease pool 里面,防止被回收。主要作用是让对象多活着一段时间,然后穿透作用域边界等等。使用场景是,我 retain 了一个对象,我有职责 release 它,但是现在不能的情况。因为我知道后续代码可能想要 retain 它 。
考虑这样一个场景,我们有个方法返回一个对象,在方法内部我们 retain 了这个对象,这意味这我们需要 release 这个对象,维持对象引用计数的平衡。但是因为这个对象是返回值,我们要确保调用方拿到的对象是没被回收的,在函数返回前 release 的话,我们就不能确保这一点。也就是说,我们需要 release 返回值,但又不能在函数返回前。这时候ÿ