危险的NSAutoreleasePool

NSAutoreleasePool作为object-c的提供的半自动化内存管理机制确实简化的维护。

object-c实现的内存管理机制是基于计数器的,类似于COM的对象维护机制。本身来所这种管理机制效率是很高的。与java和.net的自动化的三级内存管理机制相比,自动化差了些,但是性能和资源利用率确是其无法比拟的。个人认为在不同量级的应用中以引用计数器进行内存的版自动化管理是一种不错的选择。

以上这是背景,在NSAutoreleasePool对象声明和release之间是pool的管理区域,当release时pool将自动清理这个区域内声明在堆上的内存。请注意这里他会把这个区域内认为无用的内存自动清理掉,而不需要你自己release。一般的基础类型是初始化在栈上,我们不做考虑,对象类型由于我们更多的作为一个操作单元,没有太多的跨作用域的引用的情况,一般不会有太多的问题。问题回到字符串类型上面来,object-c支持的字符类型有char,char[],char*,string,NSString,NSMutableString等,char,char[]初始化在栈上,不做考虑。其他几种形式都是对char的一种封装,初始化在堆上。对于指针对象的复制一般从效率上来考虑都是浅拷贝的,只是把一个地址指针付过来,并没有真正将区域内的数据拷贝。这就产生了一个问题,这些数据会在系统认为原来的对象没有用处的时候给清理掉,而新的对象还在指向原始的位置,现在对这个对象进行操作将会产生非常严重的后果。虽然我们可以采用retain机制将对象引用计数器加1,但是无法在releas时确切的知道系统是不是会自动化的给清理掉,并且似乎这个时候系统往往会清理掉。如果我们在这个区域里操作全局的字符串对象进行操作,会是很危险的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值