自动释放池:先介绍下自动释放池的概念,自动释放池是一个对象,所以你可以创建多个自动释放池。
那么这个对象提供了那些功能呢,它主要的作用是在自动释放池被销毁时候,自动给池子中的所有对
象一一,发送release消息。其实这个功能就等效于我们自己写release。
优点: 不用再小心心翼翼的在写代码的时候,把代码写在对象release前面,防止调用僵尸对象导致出
错。从object-c2.0开始,自动释放池使用@autoreleasepool {} 创建,更加方便于直观,在
autorelease的块外,自动释放池就结束了,表示将被释放,也就是所在这个块结束时候,等效于给里面
的对象,一一发送release消息。
如何把对象加入自动释放池:
只要是继承自NSObject的对象,都有autorelease方法。调用该方法即可,将对象加入自动释放池。
注意:autorelease方法返回对象本身,所以一般是在初始化完对象后,直接调用autorelease方法。
Person与Dog对象实现十分简单,不予复述。Person拥有Dog对象,所以setter方法内存管理用retain~。
自动释放池的两种创建方式1.@autoreleasepool {} ,可嵌套创建
2.用NSAutoreleasePool进行创建。(alloc、init),不可嵌套。调用release或者drain方法进行释放。
1 //
2 // main.m
3 // autorelease.m
4 //
5 // Created by sixleaves on 15/5/9.
6 // Copyright (c) 2015年 itcast. All rights reserved.
7 //
8 9 #import <Foundation/Foundation.h>
10 #import "Person.h"
11 #import "Dog.h"
12 int main(
int argc,
const char * argv[]) {
13 @autoreleasepool {
14 15 // p-1
16 Person *p = [[[Person alloc] init] autorelease];
17 // c-1
18 Dog *c = [[[Dog alloc] init] autorelease];
19 20 // p -1 c-2
21 p.dog = c;
22 }
// p - 0 c-1 => c-0
23 24 return 0;
25 }
26 /*
输出:
2015-05-10 11:13:12.117 autorelease.m[1999:18472] Dog-dealloc
2015-05-10 11:13:12.117 autorelease.m[1999:18472] Person-dealloc
Program ended with exit code: 0
*/