最想必大家近也是被内存管理整的焦头烂额,大家也就再痛苦这么一下,今天的autorelease已经是内存管理的最后一章了,今天的内容完成我们的内存管理也就先告一段落了。希望大家一定要理解内存管理,因为内存管理在OC中的地位可以说相当于C语言中的指针。虽然现在引进了ARC机制,但是大家也要理解内存管理的过程和原理,否则到时动不动来个内存泄露,而且还找不到错误所在,那感觉.....真(ri)是(le)爽(gou)啊(le)
我们先来理解一个概念:自动释放池(autorelease pool)
1、自动释放池是OC里面的一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。
2、OC对象只要是发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶释放池),
3、autorelease其实就是对release延迟调用了,当自动释放池销毁时,释放池里面的所有对象会自动调用一次release方法(注意,是调用一次release方法)
学过Java的应该知道,Java中有一个垃圾回收机制,这个内存回收机制其实和Java中的内存回收机制还是不一样的,Java中的垃圾回收机制是不需要我们手动管理内存的,它会自动检测我们的对象需不需要回收,要是这个对象没有被使用的时候,就会被回收。OC中的内存自动回收机制是不可能像Java那样自动检测回收的,还是需要我们手动,也可以说OC中的垃圾自动回收机制是 半自动的。为什么是半自动的呢?我们再来详细讲解一下。
老规矩,我们先来建一个Student类
#import "Student.h" @implementation Student #pragma mark 回收对象 - (void)dealloc{ NSLog(@"%@ 被销毁了", self); [super dealloc]; } @end
#import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * argv[]) { //@autoreleasepool代表创建一个自动释放池 @autoreleasepool { Student *stu = [[Student alloc] init]; [stu autorelease]; } //在此处自动释放池销毁 return 0; }
好,只要写了[stu autorelease],stu对象就能放到自动释放池里面了。到自动释放池销毁的时候,stu对象执行一次release。
我们在实际项目中一般这样写
@autoreleasepool { Student *stu = [[[Student alloc] init]autorelease]; } //在此处自动释放池销毁
要注意:autorelease并不会改变引用计数器 的值,只是单单把对象放到自动释放池里面,到自动释放池销毁的时候,里面的所有对象统一执行一次release。也就是说自动释放池的销毁并不代表对象销毁,执行一次release只是让引用计数器-1,并不是被销毁。
@autoreleasepool { //...... }
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init]; //...... [pool release];
1.在ARC下,不能使用NSAutoreleasePool创建自动释放池,应该用@autoreleasepool。
2.不要把大量的循环操作放到同一个自动释放池,会造成内存上升
3.避免对大内存使用该方法,应尽量少用这种延迟释放机制
4.SDK中一般利用静态方法创建并返回的对象都是已经autorelease的了,不需要再自动释放了