object-c内存管理详解

一、理解autorelease:

      引用:http://www.cocoachina.com/bbs/read.php?tid=38763&page=7

        如果你能够真正的理解autorelease,那么你才是理解了Objective c的内存管理。Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。 m^hi}Am1
为什么需要Auto release ? c ~j")o
很多C/C++转过来的程序员会说,这个auto release有什么好,象C/C++那样,自己申请,自己释放,完全可控不好么, 这个auto relase 完全不可控,你都不知到它什么时候会被真正的release。我的理解它有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。这个应该是相对比较好理解的。、 8)n799<.
总结:1)一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。 5~ho1Ud
2)[NSString stringWithFormat:]这类函数返回的对象是不需要再自己release的,它已经被autorelease了, 如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。 W!.F\H,(
自动释放(autorelease)池 Qy!*U%tG'
在代码中创建一个字符串,如果需要返回这个字符串的话,那么需要使用autorelease(自动释放),而不是release。 :v -&}?
例如: -(NSString *)welcome ME'hN->c
      { yffg_^fR
          NSString *result; rDr3)*H?0
          result=[[NSString  alloc] initWithFormat:@“欢迎%@登录”,name]; eRV4XB:
          //[result  release]; //不能释放,否则调用者无法获得新字符串信息 DK-V3}`q}
          [result  autorelease];//正确,使用autorelease,具体见后面解释。 @JF fyQ {-
            return  result; !cblmF;0
      } +OGa}9j- 

      其实像[NSString stringWithFormat:]里面也是autorelease了 ,所以咱们不用再release,但如果他直接release,我们就无法获取字符串
1.  ojc-c 是 通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁. j2\B(PA
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的. P[E:=p
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一。 kl(id8 r
自动释放池 CJ'pZ]\G
自动释放池对象通常以如下模式创建: x+1Cs$E;
[ [ [Someclass  alloc ] init ]  autorelease] }r%Si
被添加到自动释放池后,这些对象将释放的责任传递给自动释放池。当事件循环结束时,自动释放池清空,并发送释放消息。

二、内存管理实用原则

        1、当你new、alloc 或者copy方法创建一个对象时该对象的保留计数值加1、当不再使用该对象时,负责发送一条release或者autorelease消息,这样该对象使用寿命结束时将被摧毁。

        2、当你通过任何其他方法获得一个对象时,则假设该对象保留计数值为1,而且已经被自动释放,你不需要执行任何操作来确保该对象被清理,如果你打算在一段时间内拥有该对象,在寿命这需要保留并确保在操作完成时释放它;

        3、如果你保留了某个对象,你需要(最终)释放或自动释放该对象,必须确保retain方法和release方法的使用次数相等

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值