OC @autorelease

来源:互联网 发布:2016季后赛数据 编辑:程序博客网 时间:2024/05/17 22:45


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


0 0