自動釋放池:先介紹下自動釋放池的概念,自動釋放池是一個對象,所以你可以創建多個自動釋放池。
那么這個對象提供了那些功能呢,它主要的作用是在自動釋放池被銷毀時候,自動給池子中的所有對
象一一,發送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
*/