OC基础 自动释放池

#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;
}
原文地址:https://www.cnblogs.com/zhangqing979797/p/13258139.html