使用@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;
}
