Sian 发表于 2014-3-19 17:29:43

Autorelease的基本使用

1、在黄金法则(谁创建谁释放,谁retain,谁release)中,每一个alloc都会对应一个release,但也可以对应一个autorelease
2、autorelease有两种写法,最新的写法是@autoreleasepool {},以前的写法是创建一个自动释放池的对象,在池被释放之前的代码都属于该释放池的管辖范围,格式如:NSAutoreleasePool * pool = [ init],再;
3、不同的释放池分别占据着不同的作用域,所以不同释放池中的对象可以同名;
4、自动释放池属于一种栈的数据结果,因此在自动释放池嵌套时,对象自动放入当前栈顶的池中,通俗一点讲,当前对象属于哪个释放池的直接管辖区域,就由哪个池负责释放;
5、所谓的自动释放器释放对象,并不意味着释放池会对池中的对象真正意义上的释放,实现上只是对所有的对象做一次release操作,仅此而已
6、一个retain对应一个release,一个retain也可以对应一个autorelease
参考代码:
Person.h
//
//Person.h
//Autorelease
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, retain) NSString *name;

@end

Person.m
//
//Person.m
//Autorelease
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)dealloc
{
    // 在对象dealloc之前输出一个标识,表明调用了该方法,为区分对象,加个对象名称
    NSLog(@"Person %@ is dealloc...", _name);
   
    ;
}

@end

main.m
//
//main.m
//Autorelease
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

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

int main()
{
    // 创建一个自动释放池
    @autoreleasepool {
      
      Person * p = [[ init] autorelease];
      
      p.name = @"yusian";
      
    }// 自动释放池本身在这里被释放,即所池内的所有对象进行一次release操作
   
    // 以前版本的自动释放池创建方式:
    NSAutoreleasePool * pool = [ init];
   
      // 由于不同的作用域,这里的Person对象也可以是p
      Person * p = [[ init] autorelease];
      
      p.name = @"Sim";
   
    // 池释放有两种写法, 或 都可以
    ;// ;

    return 0;
}
运行结果:2014-03-19 17:16:29.396 Autorelease Person yusian is dealloc...2014-03-19 17:16:29.398 Autorelease Person Sim is dealloc...Program ended with exit code: 0

Sian 发表于 2014-3-19 22:06:52

Person * p = [[ init] autorelease]还可以通过一个类方法来实现,省去每次重复的繁琐

+ (void)person
{
      return [[ init] autorelease]
}

这样就可以直接调用类方法来创建类并且实现autorelease
即Person * p = [[ init] autorelease]可以写成Person * p = ;
页: [1]
查看完整版本: Autorelease的基本使用