#import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { //自己创建的对象 虽然放在自动释放池中,但是不受管理 加上 autorelease 管理 Person* p =[[[Person alloc]init]autorelease]; p.age=25; // [p release]; [p retain]; //引用计数+1 加入对象池 只会进行一次销毁操作 如果对象引用计数为0,会被销毁 } return 0; }
person.h
@interface Person : NSObject @property(nonatomic,assign)int age; +(Person*)personWithAge:(int)age; -(void)lotsOfObject; @end
person.m
#import "Person.h" @implementation Person // 类方法中创建延时对象 ,因为要返回给别人使用,所以无法立即销毁, 通过给这个对象发送autorelease消息 让它延迟释放 +(Person*)personWithAge:(int)age { Person* p =[[[Person alloc]init]autorelease]; p.age=age; // [p release] return p; } -(void)lotsOfObject { // 当一个方法中,创建了大量的需要延迟释放的对象,并且这些对象在方法结束后不在使用,最好的方法加入独立的自动释放池,以保证这些对象能够得到有效的,及时的释放 @autoreleasepool { // 创建大量需要延迟的代码 for(int i=0;i<1000;i++) { Person* p=[Person personWithAge:i]; } } NSLog(@"lotsOfObject end"); } -(void)dealloc { NSLog(@"Person dealloc"); [super dealloc]; } @end
mian
//3.自动释放池在销毁时,会给受它管理的每个对象发送一次release消息 如果对象引用计数为0 ,对象会销毁 //4 不要滥用自动释放池,因为自动释放池只有它在销毁时才会受它管理的对象做释放,如果程序中创建了大量的对象,这些对象就得不到有效,及时的释放 //5.自动释放池可以有多个 并且可以嵌套,自动释放池采用栈的结构来管理,创建一个自动释放池,它就被压入栈,栈顶总是离你代码最近的自动释放池 #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { //自己创建的对象 虽然放在自动释放池中,但是不受管理 加上 autorelease 管理 Person* p =[[[Person alloc]init]autorelease]; p.age=25; // [p release]; // [p retain]; //引用计数+1 加入对象池 只会进行一次销毁操作 如果对象引用计数为0,会被销毁 @autoreleasepool { Person* p2=[Person personWithAge:30]; [p2 lotsOfObject]; @autoreleasepool { Person* p3=[Person personWithAge:35]; } NSLog(@"lotsOfObject2 end"); } } // 第二种方法创建自动释放池 NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init]; Person* p3=[Person personWithAge:35]; [pool release]; return 0; }