Autorelease的基本使用
1、在黄金法则(谁创建谁释放,谁retain,谁release)中,每一个alloc都会对应一个release,但也可以对应一个autorelease2、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
Person * p = [[ init] autorelease]还可以通过一个类方法来实现,省去每次重复的繁琐
+ (void)person
{
return [[ init] autorelease]
}
这样就可以直接调用类方法来创建类并且实现autorelease
即Person * p = [[ init] autorelease]可以写成Person * p = ;
页:
[1]