OC自动释放池autoreleasepool介绍
自动释放池的机制是:它使得应用在创建新对象时,系统能够有效地管理应用所使用的内存。
@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介绍的更多相关文章
- 刀哥多线程自动释放池autoreleasepool
自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...
- 自动释放池autoreleasepool
自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...
- C++模拟OC的多重自动释放池
使用过OC的都知道,OC的引用计数机制用起来还比较方便.于是就仿照OC的形式搞了个C++引用计数. 支持多重自动释放池,每次autorelease都会放到栈顶的自动释放池中. 自动释放池也可以像变量一 ...
- 自动释放池的前世今生 ---- 深入解析 autoreleasepool
http://draveness.me/autoreleasepool.html 关注仓库,及时获得更新:iOS-Source-Code-Analyze Follow: Draveness · Git ...
- 63 (OC)* NSAutoreleasePool 自动释放池
目录 0:ARC 1: 自动释放池 2:NSAutoreleasePool实现原理 3:autorelease 方法 4: Runloop和Autorelease的关系 5: Using Autore ...
- autoreleasepool 自动释放池的理解
常见的面试题:以下代码存在什么样的问题?应该如何改进? for (int i = 0; i < 100000; i++) { NSString *str = @"abc"; ...
- OC中对象元素的引用计数 自动释放池的相关概念
OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc] view plaincopy 1. // 2. / ...
- OC学习篇之---数组对象的引用计数问题和自动释放池的概念
之前一片文章中我们介绍了OC中的两个关键字@property和@synthesize的使用的使用: http://blog.csdn.net/jiangwei0910410003/article/de ...
- OC 内存泄露 自动释放池
花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...
随机推荐
- Extjs中设置只读的样式问题
废话不多说,直接上代码: view.down('#imageFile').hide(); view.down('#save_button').hide(); view.show(); view.d ...
- FreeBSD中实现root的ssh
在虚拟机中刚装好FreeBSD,结果不能以远程方式登录root,然后在如下链接中找到了解决方法: http://blog.chinaunix.net/uid-26719405-id-3822697.h ...
- C#通过修改注册表改变IE默认选项
修改注册表,这个代码好实现,关键是怎么找到对应的注册表值,也就是说画一条线很容易,难的是找到要在哪里画,然后我百度了一圈,出来的都是画线的,没有指出或者指出的不全的注册表对应值,只能FQ谷歌了,也就有 ...
- android自定义View_1——Custom Drawing
前言:自定义view重要的部分就是view的展示样式,为了实现view的样式可以重写onDraw()方法. 一:Override onDraw() 1.当覆盖了onDraw()方法后,需要一个Canv ...
- linux安装consul集群
一.集群规划 consul借助agent来运行,类似elk的logstash agent 或 zabbix监控系统的agent , 每个需要被发现的服务上,通过consul agent client ...
- jpofiler监控JVM
1.官方下载地址,选择自己想要的版本 https://www.ej-technologies.com/download/jprofiler/version_92 2.分为linux服务端.window ...
- 三、docker官网注册docker id
docker官网注册docker ID 电脑注册docker没有成功,网上有人说用手机注册,试了一下确实可以注册. 1.下载蓝灯软件开启FQ代理. 2.登录网站,按照提示注册.
- IntelliJ IDEA For Mac 快捷键 [转]
Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...
- 1*SUM(i) 开源社区
w 算法优化 Cells(i, "Y") + Cells(i, "Z") * 0.2 多计算了一次是 1*SUM(i)次 Sub 订单利润() Dim Adju ...
- <2013 08 27> 雅思阅读相关
1.雅思阅读的总体难度不大,但是时间较紧,三段较长的阅读材料和40个题目,总耗时60min.基本上前两个材料可以花15~20min,最后一个材料至少花20min完成. 2.阅读的技巧在于三点:其一,先 ...