自动释放池的机制是:它使得应用在创建新对象时,系统能够有效地管理应用所使用的内存。

@autoreleasepool
{
statements
}

在创建新对象时,并且系统未启动ARC特性,那么在使用完该对象后需要释放对象空间。

此时有两种选择,一种是给对象发送release消息,此时该对象空间就会马上被释放掉;

另一种是给对象发送autorelease消息,此时系统不会马上释放该对象,而是在离它最近的自动释放池结束的位置会被释放掉,因为自动释放池在执行到末尾时,会给池中对象发送release消息,将引用计数减为0,然后发送dealloc消息,并将它们的内存释放掉。

下面是自动释放池的例子。

int main(int argc, char * argv[])
{
@autoreleasepool
{ Fraction *frac1 = [[Fraction alloc] init];
Fraction *frac2 = [[Fraction alloc] init]; [frac1 setNumberator: 2];
[frac1 setDenominator: 3]; [frac2 setNumberator: 3];
[frac2 setDenominator: 7]; NSLog(@"First fraction is:");
[frac1 print]; NSLog(@"Second fraction is:");
[frac2 print]; [frac1 release];
[frac2 release];
}
return 0;
}

当你使用完一个对象,需要自己手动释放这些对象。

程序中,在main开始时创建自动释放池,在应用返回之前,main结束的位置清理自动释放池。

-(Fraction *) add: (Fraction *) f
{
//对两个分数求和
// a/b + c/d = ((a*b) + (b*c)) / (b*d)
//存储相加后的结果 Fraction *result = [[Fraction alloc] init]; result.numberator = numberator * f.denominator + denominator * f.numberator; [result reduce];
return result;
}

如果使用手工内存管理,这个方法会出现一个问题,创建的对象会在计算执行后被方法作为结果返回。因为方法返回这个对象,所以并不能释放它。

解决这个问题的最好方法是自动释放这个对象,这样它的值就能够作为结果返回,能够延迟对象的释放直到自动释放池被清理。

可以写成下面的样子。

-(Fraction *) add: (Fraction *) f
{
//对两个分数求和
// a/b + c/d = ((a*b) + (b*c)) / (b*d)
//存储相加后的结果 // Fraction *result = [[Fraction alloc] init];
Fraction *result = [[[Fraction alloc] init] autorelease]; result.numberator = numberator * f.denominator + denominator * f.numberator; [result reduce];
return result;
}

或者是

-(Fraction *) add: (Fraction *) f
{
//对两个分数求和
// a/b + c/d = ((a*b) + (b*c)) / (b*d)
//存储相加后的结果 Fraction *result = [[Fraction alloc] init]; result.numberator = numberator * f.denominator + denominator * f.numberator; [result reduce];
//return result;
return [result autorelease];
}

OC自动释放池autoreleasepool介绍的更多相关文章

  1. 刀哥多线程自动释放池autoreleasepool

    自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...

  2. 自动释放池autoreleasepool

    自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...

  3. C++模拟OC的多重自动释放池

    使用过OC的都知道,OC的引用计数机制用起来还比较方便.于是就仿照OC的形式搞了个C++引用计数. 支持多重自动释放池,每次autorelease都会放到栈顶的自动释放池中. 自动释放池也可以像变量一 ...

  4. 自动释放池的前世今生 ---- 深入解析 autoreleasepool

    http://draveness.me/autoreleasepool.html 关注仓库,及时获得更新:iOS-Source-Code-Analyze Follow: Draveness · Git ...

  5. 63 (OC)* NSAutoreleasePool 自动释放池

    目录 0:ARC 1: 自动释放池 2:NSAutoreleasePool实现原理 3:autorelease 方法 4: Runloop和Autorelease的关系 5: Using Autore ...

  6. autoreleasepool 自动释放池的理解

    常见的面试题:以下代码存在什么样的问题?应该如何改进? for (int i = 0; i < 100000; i++) { NSString *str = @"abc"; ...

  7. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  8. OC学习篇之---数组对象的引用计数问题和自动释放池的概念

    之前一片文章中我们介绍了OC中的两个关键字@property和@synthesize的使用的使用: http://blog.csdn.net/jiangwei0910410003/article/de ...

  9. OC 内存泄露 自动释放池

    花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...

随机推荐

  1. Java Resource路径小结

    首先一点很重要,Java中不存在标准的相对路径,各种相对路径取资源的方式都是基于某种规则转化为绝对路劲 然后一点也很重要,绝对不要直接使用绝对路径,否则死得很难看 基于以上两点,总结Resource路 ...

  2. DataUml Design 介绍9 - DataUML 1.3版本功能(查询分析器功能等)

    DataUML 1.3 (下载)主要更新内容如下: 1.增加查询分析器功能: 2.增加打开历史文件记录功能: 3.修改查询对象功能: 4.增加显示对象长度功能: 5.增加配置显示表字段功能: 6.增加 ...

  3. 24模拟keepalved vrrp功能,监听主节点,如果主节点不可访问则备节点启动并配置LVS实现接管主节点的资源提供服务(提醒:注意ARP缓存)

    [root@lb04 scripts]# cat ha_lv.sh #!/bin/bash while true do check_count=$(nmap 10.0.0.13|grep " ...

  4. gradle配置flavors上传nexus服务器

    分拆代码的过程中需要把核心代码编译成一个库上传到内部maven服务器上,所以研究了一下上传私库的方法. 首先拆分的是工具类库,这个库和java的库类似,没有配置flavors,所以按照网上通用的方法引 ...

  5. Spring MVC生成RSS源

    下面的示例演示如何使用Spring Web MVC框架生成RSS源. 首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: 创建 ...

  6. android代码中自定义布局

    转载地址:http://blog.csdn.net/luckyjda/article/details/8760214RelativeLayout rl = new RelativeLayout(thi ...

  7. NDK工具制作

    NDK工具制作 - Generate a stand-alone toolchain of the NDK, example: `./android-ndk-r10/build/tools/make- ...

  8. 创建新的C++工程来调用Caffe对图片进行识别

    前段时间一直在跑Caffe训练数据.之前用训练好的caffemodel对图片进行分类都是用的命令行指令,于是就想着自己新建一个工程来调用caffe,结合classification的代码来对图片进行分 ...

  9. PDP2

    1. 程序入口 配置文件config.xml中: 2. index.html中显示,引入的cordova.js 就说明了 cordova apps 3. 看 main.ts

  10. 【BZOJ1812】[Ioi2005]riv 树形DP

    [BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...