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! /********************** ...
随机推荐
- LeetCode581. Shortest Unsorted Continuous Subarray
Description Given an integer array, you need to find one continuous subarray that if you only sort t ...
- Vim使用技巧(4) -- 命令行模式 【持续更新】
基本保存,退出,帮助 :help //帮助 :w //保存 :q //退出 :wq //保存后退出 :q! //强制不保存退出 %s/a/b/g //将当前文件的a全部替换成b /abc //正向查找 ...
- OpenFiler configuration
5.OpenFiler configuration 登录Openfiler 步骤1:安装 FireFox 步骤2:通过FireFox以HTTPS://server-ip:446 远程访问O ...
- Java HashMap中在resize()时候的rehash,即再哈希法的理解
HashMap的扩容机制---resize() 虽然在hashmap的原理里面有这段,但是这个单独拿出来讲rehash或者resize()也是极好的. 什么时候扩容:当向容器添加元素的时候,会判断当前 ...
- 字符串截取mb_substr
mb_substr("字符串","截取开始位置","截取个数","编码格式如UTF-8")
- ASP.NET:把ashx写到类库里并在页面上调用的具体方法
在类库中建Http Handler的操作很简单,就是添加一个普通的类,然后把之前ashx里的代码几乎一模一样贴到这个类中.但要注意命名空间和类名,因为之后我们会用 到.样例Handler: names ...
- node c++ addon注意事项
The module_name needs to match the filename of the final binary (minus the .node suffix).
- html中div获取焦点,去掉input div等获取焦点时候的边框
经测试只有在IE chrome才会在获取焦点时有边框 使用CSS div{ outline:none; } DIV焦点事件详解 --[focus和tabIndex] 摘自:http://my.osc ...
- &&和&(||和|)区别
上代码,引出问题 public class Test { private static int j = 0; private static Boolean methodB(int k) { j += ...
- 《从零开始学Swift》学习笔记(Day 41)——类的继承
原创文章,欢迎转载.转载请注明:关东升的博客 Swift中的继承只能发生在类上,不能发生在枚举和结构体上.一个类可以继承另一个类的方法.属性.下标等特征,当一个类继承其他类时,继承类叫子类,被继承类叫 ...