天天看點

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

繼續閱讀