f(sixleaves) = sixleaves

重剑无锋 大巧不工

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  95 随笔 :: 0 文章 :: 7 评论 :: 0 Trackbacks
自动释放池:先介绍下自动释放池的概念,自动释放池是一个对象,所以你可以创建多个自动释放池。
那么这个对象提供了那些功能呢,它主要的作用是在自动释放池被销毁时候,自动给池子中的所有对
象一一,发送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

     */
posted on 2015-05-10 11:17 swp 阅读(206) 评论(0)  编辑 收藏 引用 所属分类: objective-c

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理