arc下编译器会优化成
void *context = objc_autoreleasePoolPush();
// {}中的代码
objc_autoreleasePoolPop(context);
向一个结构AutoreleasePoolPage,中写入需要自动释放的对象,类似一种标记,调用objc_autoreleasePoolPop(context)后,就会把这中间的对象release一下。
这里要注意的是,方法返回值是怎么做到自动释放的?
其使用Thread Local Storage(TLS)线程局部存储,每次存入线程或者从线程取出来。
我们没有卸载{}中的自动释放对象,会在每个runloop结束时候去释放,相当于一个大的autoreleasepool中。
可以看看这篇文章 http://blog.sunnyxx.com/2014/10/15/behind-autorelease/