autorelease有什么用
我们知道MRC是需要自己 retain和release操作的,而ARC则帮我们做好了这些事,我们不需要对每个alloc的对象进行retain操作了。那么autorelease又是什么,跟release什么关系呢?MRC模式下,[object autorelease]可以延迟对象的内存释放。main方法里面的@autoreleasepool又是什么?NSAutoreleasePool又是什么?
NSAutoreleasePool和@autoreleasepool
NSAutoreleasePool 是 Cocoa 用来支持引用计数内存管理机制的类, 当一个autorelease pool(自动释放池)被drain(销毁)的时候会对pool里的对象发送一条release的消息.
但是官方文档说明,使用@autoreleasepool这个block比NSAutoreleasePool更高效!并且在MRC环境下同样适用
看图说明autorelease做了什么

那我们什么时候会用到autorelease呢,举个例子
for (NSInteger i = 0; i < 100000; i++) {
NSObject *obj = [[NSObject alloc]init];
NSLog(@"%@",obj);
}
这段代码如果在MRC模式下,每执行一次循环,就会有一个string加到当前的runloop中的自动释放池中,只有当自动释放池被release的时候,自动释放池中的标示了autorelease的这些数据所占用的内存空间才能被释放掉。当内存空间将被耗尽而没有被释放掉,就会出现了内存溢出的现象。
具体是
·写基于命令行的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
·写循环,循环里面包含了大量的临时创建对象。(以上的例子)
·创建了新的非Cocoa的线程
·长时间在后台运行的任务
说到最后一个问题,main方法里面的@autoreleasepool是什么?
我们每次创建工程的时候,系统就会给我们创建了一个@autoreleasepool。
首先我们要知道
一个项目里面可以有多个@autoreleasepool
每一个NSRunloop会隐式的创建一个@autoreleasepool,每次新建一个@autoreleasepool都会像堆栈一样压入@autoreleasepool组里面,新的@autoreleasepool会代替当前的@autoreleasepool成为新的当前@autoreleasepool。当每一个NSRunloop结束的时候,会将当前的autoreleasepool进行销毁,如下

总结就是,可以把autorelease pool 理解成一个类似父类与子类的关系,main()创建了父类,每个Runloop自动生成的或者开发者自定义的autorelease pool都会成为该父类的子类。当父类被释放的时候,没有被释放的子类也会被释放,这样所有子类中的对象也会受到release消息。
例如以下这个例子
__autoreleasing ZJRequest *str = nil;
@autoreleasepool {
str = [[ZJRequest alloc]init];
}
NSLog(@"%@",str);
此时str在@autoreleasepool调用完之后,便释放掉了,此时再打印str程序将会崩溃,原因是此时str已经变成野指针,不能对其发送description消息了。
这里我们研究autoreleasepool有什么用,底层实现暂时不做描述了