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

@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. codeforces #364b Cells Not Under Attack

    比赛的时候 long long sum=n*n,计算不出1e10长度到数,没有搞掉. 哎,以后要注意这个地方.这个题其实不难: 统计能被攻击到的个数,然后用总的个数减掉就可以了.注意有些地方重复计算, ...

  2. ex:0602-169 遇到不完整或无效的多字节字符,转换失败

    错误原因:在AIX系统中,用vi命令编辑文件,出现rt错误,是因为AIX系统不识别文件编码格式. 解决方法:建议重新新建一个编码格式为ASC的文件,再重新上传到AIX系统中,或者改变访问linux的客 ...

  3. Thinkphp5 使用命令行模式(cli模式)

    Tp5的cli模式跟Tp3.2变化较大,有自己的一套方式,在这里做个搬运工,把Tp文档的东西搬运过来,方便大家. 原出处截图 创建自定义命令行 第一步,配置command.php文件,目录在appli ...

  4. Manjaro折腾笔记:我的数据科学环境搭建之路

    ss并且开机启动 0. 安装shadowsocks sudo pip install shadowsocks 1. 建立配置文件ss.json 我的位置是:/home/ray/Documents/sh ...

  5. Java-iBATIS

    1.是什么? 2010年迁移到了google code,并且改名为MyBatis.ibatis1.ibatis2.到了版本3就改名为mybatis. iBATIS的是一个持久层框架,它能够自动在 Ja ...

  6. o.a.catalina.core.AprLifecycleListener : An incompatible version [1.2.7] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]

    1.错误信息提示: 2019-04-16 22:02:05.811 ERROR 18112 --- [           main] o.a.catalina.core.AprLifecycleLi ...

  7. lucene中的IndexWriter.setMaxFieldLength()

    lucene中的IndexWriter.setMaxFieldLength() 老版本的Lucene中,IndexWriter的maxFieldLength是指一个索引中的最大的Field个数. 这个 ...

  8. iphone开发常用代码笔记

    1.显示图像: 1 2 3 4 5 6 CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 109.0f); UIImageView *myImag ...

  9. ie10 css hack 条件注释等兼容方式整理

    点评:ie10已经上线一段时间了,相信已经有一部分前端潮人体验过了,截至到现在,在ie6到ie9的浏览器各种各样的古怪行为,开发人员不得不使用条件注释,有条件的类,和其他特定于IE的css hack来 ...

  10. CodeMirror:基于JavaScript的代码编辑器

    官方网站定义: http://codemirror.net/ CodeMirror is a versatile text editor implemented in JavaScript for t ...