1、在黄金法则(谁创建谁释放,谁retain,谁release)中,每一个alloc都会对应一个release,但也可以对应一个autorelease
2、autorelease有两种写法,最新的写法是@autoreleasepool {},以前的写法是创建一个自动释放池的对象,在池被释放之前的代码都属于该释放池的管辖范围,格式如:NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init],再[pool release];
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);
-
- [super dealloc];
- }
- @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 = [[[Person alloc] init] autorelease];
-
- p.name = @"yusian";
-
- }// 自动释放池本身在这里被释放,即所池内的所有对象进行一次release操作
-
- // 以前版本的自动释放池创建方式:
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-
- // 由于不同的作用域,这里的Person对象也可以是p
- Person * p = [[[Person alloc] init] autorelease];
-
- p.name = @"Sim";
-
- // 池释放有两种写法,[pool drain] 或 [pool release]都可以
- [pool drain]; // [pool release];
- return 0;
- }
复制代码 运行结果:2014-03-19 17:16:29.396 Autorelease[2025:303] Person yusian is dealloc... 2014-03-19 17:16:29.398 Autorelease[2025:303] Person Sim is dealloc... Program ended with exit code: 0
|