天天看点

OC @autorelease

使用@autorelease关键字,生成自动释放池, 放在释放池中的对象, 我们不用再关键何时需要对其进行release操作

当池子被销毁时, 会对放在池子中的所有对象进行一次release操作. 池中对象是以栈的形式存放的, 先生成的对象后释放, 后生成 的对象行释放

//
//  Person.h
//  autorelease
//
//  Created by LiuWei on 15/4/17.
//  Copyright (c) 2015年 LiuWei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, assign)int age;

+ (id)personWithAge:(int) age;
@end
           
//
//  Person.m
//  autorelease
//
//  Created by LiuWei on 15/4/17.
//  Copyright (c) 2015年 LiuWei. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"age = %i Person --- dealloc", _age);
    [super dealloc];
}


// 快速创建autorelease对象
+ (id)personWithAge:(int)age
{
    Person *p = [[[Person alloc]init]autorelease];
    p.age = age;
    
    return p;
}
@end
           
//
//  main.m
//  autorelease
//
//  Created by LiuWei on 15/4/17.
//  Copyright (c) 2015年 LiuWei. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"


/*
 autorelease
 好处 : 不用再关心何时释放对象
 注意 : 占用内存较大的对象不要随便使用autorelease  大内存对象一般用release, 进行精确控制
       可以创建无数多个释放池, 这些池子都是以栈结构形式存在
       当一个对象调用autorelease方法, 会将这个对象放到释放池的栈顶
*/
int main(int argc, const char * argv[])
{
    // 自动释放池创建方式1
    // autorelease 返回对象本身
    // 会将对象放到一个自动释放池中
    // 当自动释放池被销毁时,会对池子里边的所有对象做一次release操作
    
    // Person *p = [[[Person alloc]init]autorelease];
    // p.age = 20;
    
    
    // 自动释放池创建方式2
    // 在大括号之间创建的对象都会被放到自动释放池中
    @autoreleasepool 
    { // 释放池开始
        
        Person *p = [[[Person alloc]init]autorelease];
        p.age = 1;
        
        
        @autoreleasepool
        { // 释放池开始
            
            Person *p2 = [[[Person alloc]init]autorelease];
            p2.age = 2;
            
            Person *p3 = [[[Person alloc]init]autorelease];
            p3.age = 3;
            
        } // 释放池结束
        
        
        Person *p4 = [[[Person alloc]init]autorelease];
        p4.age = 4;
        
        Person *p5 = [Person personWithAge:5];
        
    } // 释放池结束, 销毁释放池,对池中所有对象进行一次release操作
    
    
    

    return 0;
}
           
OC @autorelease

继续阅读