一.原理
我们都知道每个类在创造实例的时候都会在内存中给它划分一片区域来存放信息,然后对象名作为指针指向该内存空间,如果这个对象不再使用,这片内存区域就会被系统回收,删掉原内容或覆盖上其他内容,OC与.Net/Java那种全自动的垃圾回收机制是不同的,有人称其为半自动模式.
1.谁创建,谁释放.凡事通过alloc.new.copy来创建的对象(会自动引用计数设为1),都必须调用release或autorelease(计数-1)来释放.如果在一个类的某个方法中alloc一个对象,切没有调用autorelease,那么就需要在这个类的dealloc方法中调用release;if调用了autorelease,那么在dealloc方法中就什么都不需要做了.
2."引用计数(reference count或retain count)"来判断一个内存空间是否仍在使用.因为在对象的内部保存一个数字,来表示被引用的次数.需要销毁对象时,不直接调用dealloc,当计数(retain count)为0时,系统才会调用dealloc来真正的销毁这个对象. " 谁retain,谁release"
{
Man* man=[Man new]; ..........生成一个新对象man,引用计数为1
NSLong(@"%lu",[man retainCount]);
[man retain];.......手动增加一个引用计数来保留man对象,引用计数为2
[man release];..........手动释放一个引用计数,1
[man release]............再次释放,这时的man对象的内存已经被删掉了,0
return 0;
}
3.OC指针赋值时,计数不会自动增加
{
Man* man1=[Man new];.........1
Man* man2=man1;..................1
[man2 retain];............................手动retain,计数才会加一,2
[man1 release];.........................1
[man2 release];.........................0如果man2不被release,内存泄露
}
4.自动释放池(autorelease pool),与autorelease,可以自动释放对象
Man* man=[[Man new] autorelease];后面就无需再释放
自动释放池在创建一个新的项目时,xcode会自动写好,也可以手动创建
{
NSAutoreleasePool* pool;
pool=[NSAutoreleasePool new]; //手动创建
Man* man1;
Man* man2;
//其实在NSAutoreleasePool的内部包含了一个数组(NSMutableArray),用来保存声明为autorelease的所有对象.
//如果声明了一个autorelease对象,系统就自动把此对象加入到数组中
[man1 autorelease];
[man2 autorelease];//
//当pool销毁时,数组中的所有对象全部被销毁,
[pool release];
}