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

@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. Extjs中设置只读的样式问题

    废话不多说,直接上代码:   view.down('#imageFile').hide(); view.down('#save_button').hide(); view.show(); view.d ...

  2. FreeBSD中实现root的ssh

    在虚拟机中刚装好FreeBSD,结果不能以远程方式登录root,然后在如下链接中找到了解决方法: http://blog.chinaunix.net/uid-26719405-id-3822697.h ...

  3. C#通过修改注册表改变IE默认选项

    修改注册表,这个代码好实现,关键是怎么找到对应的注册表值,也就是说画一条线很容易,难的是找到要在哪里画,然后我百度了一圈,出来的都是画线的,没有指出或者指出的不全的注册表对应值,只能FQ谷歌了,也就有 ...

  4. android自定义View_1——Custom Drawing

    前言:自定义view重要的部分就是view的展示样式,为了实现view的样式可以重写onDraw()方法. 一:Override onDraw() 1.当覆盖了onDraw()方法后,需要一个Canv ...

  5. linux安装consul集群

    一.集群规划 consul借助agent来运行,类似elk的logstash agent 或 zabbix监控系统的agent , 每个需要被发现的服务上,通过consul agent client ...

  6. jpofiler监控JVM

    1.官方下载地址,选择自己想要的版本 https://www.ej-technologies.com/download/jprofiler/version_92 2.分为linux服务端.window ...

  7. 三、docker官网注册docker id

    docker官网注册docker ID 电脑注册docker没有成功,网上有人说用手机注册,试了一下确实可以注册. 1.下载蓝灯软件开启FQ代理. 2.登录网站,按照提示注册.

  8. IntelliJ IDEA For Mac 快捷键 [转]

    Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...

  9. 1*SUM(i) 开源社区

    w 算法优化 Cells(i, "Y") + Cells(i, "Z") * 0.2 多计算了一次是 1*SUM(i)次 Sub 订单利润() Dim Adju ...

  10. <2013 08 27> 雅思阅读相关

    1.雅思阅读的总体难度不大,但是时间较紧,三段较长的阅读材料和40个题目,总耗时60min.基本上前两个材料可以花15~20min,最后一个材料至少花20min完成. 2.阅读的技巧在于三点:其一,先 ...