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