autorelease自动释放池
来源:互联网 发布:pcm-d50淘宝 编辑:程序博客网 时间:2024/05/16 11:05
一.自动释放
什么是自动释放?字面意思就是一种事物用完之后就会自动脱落,用比喻就好比发射卫星的火箭,燃料用完了由于需要减轻重量,所以就得脱离主体.那么在oc中自动释放是什么意思呢?就是内存当中存有的数据,经过某些步骤到最后就释放了,也就是说不存在了.
二.自动释放池
既然说起了自动释放了,那么就不能忽略自动释放池了.怎么表示呢?
@autoreleasepool {要实现代码块;}这就是代码的表现形式.接着我们来说说它的作用吧.
//在@autoreleasepool结束时或者被手动释放时,会对池中所有"加入了该池"的对象进行一次release操作,可以不再关心relea se的调用时间,也不需要再关心对象释放的时间.前面我们已经说过了,release在内存中的作用了三句话:
//1)谁引用,谁retain;
//2)谁引用,谁release;
//3)谁retain,谁release;
三.autorelease与release的区别
那么怎么区分两者呢?我们来看看区别吧!
release是立即执行对象的retainCount -1操作,而autorelease是让对象加入自动释放池,并不立即执行计数器-1操作,在自动释放池结束时再执行release操作,相当于release操作的延迟.
我们来看看代码:
-(void)dealloc{ NSLog(@"Person 销毁了....内存释放"); [super dealloc]; }上面重写了父类的构造方法.看下面的访问.
Person *per = [[Person alloc] init]; [per release];得出来的结果是:
[1383:1829431] Person 销毁了....内存释放这是为什么呢?因为在release的时候直接,也就是释放的时候,调用了重写的方法.所以就打印出来了结果.也就是说德dealloc什么时候才会执行呢,也就是在realease释放的时候直接调用了.
Person *per = [[Person alloc] init]; // [per release];当你注释掉了[per release]的时候是打印部出结果的.下面我们同过自动释放池来释放.
// [per release]; [per autorelease];
[1401:1880907] Person 销毁了....内存释放看上面的结果完全的可以说明有些时候autorelease和release是可以相等的,但是又不完全相等.[per autorelease]设置在释放池自动销毁,并不是马上销毁.
四.autorelease作用的范围
那么autorelease运用有多大的范围呢?我们来看看下面的程序吧!
@autoreleasepool { Person *per = [[Person alloc] init];// [per release];// [per autorelease]; }(1)// [per autorelease]; NSLog(@"%p",per);//这段代码是无法执行的.由上面的程序,我们就可以看出来,当代码出了途中的(1)处的时候是无法打印出结果的,也就是说会报错.所以也就是说[per autorelease]这段代码的作用域的hi在离它最近的花括号.
五.autorelease的使用注意
//1.只有在池内调用autorelease方法才加入自动释放池: [obj autorelease]//2.每调用一次autorelease操作,自动释放池结束时会执行一次release操作,所以不要多次调用//3.自动释放池是释放的延迟,不要在池内创建过多的对象,也不要对占用内存大的对象使用autorelease//4.自动释放池嵌套:栈顶层池中的对象最先释放上面写的一定是使用的重点,使用的时候要特别的注意,否则就会出错.
六.autorelease的不足
控制不灵活,只能等到释放池销毁才会release.不能很好的控制什么时候销毁,销毁的时候能调用dealloc,所以说不是很推荐用.最后我想说这是我分享给大家的我的心得,也是我的总结,希望对你们有用吧.
0 0
- autorelease自动释放池
- Autorelease自动释放池
- 自动释放池(Autorelease Pools)
- iOS 自动释放池Autorelease
- Autorelease Pools自动释放池概要
- objective-C 自动释放池(autorelease pool)
- Objective-C Autorelease Pools(自动释放池)
- IOS 自动释放池Autorelease pool
- Autorelease自动释放池的使用
- OC学习笔记之autorelease与自动释放池
- autorelease pool的内存管理之-自动释放池
- OC-027.手动内存管理中的自动释放池@autorelease
- 内存管理以及Autorelease和自动释放池
- 回顾自动释放池的使用及个人理解autorelease
- 深入理解Objective-C: Autorelease Pool (自动释放池)
- objective-C 的内存管理之-自动释放池(autorelease pool)
- Object-C内存管理---资源自动释放池(The Autorelease Pool)
- objective-C 的内存管理之-自动释放池(autorelease pool)
- Linux下Hadoop集群的搭建(2)—单机模式
- 【Java基础提高】HashTable源码分析(六)
- sed命令详解
- hdu 1698 Just a Hook(线段树+lazy优化)
- 进制转换原理
- autorelease自动释放池
- hihocoder 1032
- eclipse下的android开发环境突然崩溃
- Mongodb操作
- java web一HTTP协议
- 【操作系统】LinuxFedora13当new一个新内存空间的时候操作系统如何分配
- pptpd vpn的配置
- Yocto tips (2): Yocto Linux内核编译目录在哪?
- 【蓝桥第二周】01背包问题