【Objective-C】OC中自动释放池的基本概念和使用方法

自动释放池的基本概念

     cocoa中有一个自动释放池(Autorelease Pool)的概念,顾名思义,它是可以存放一些实体的

集合,在这个自动释放池中的对象,是能够被自动释放的。NSObject类提供了一个autorelease

消息,当我们向一个对象发送一个autorelease消息时,这个对象就被放入到自动释放池。

创建自动释放池

        @autoreleasepool {

        //入池对5.0之后的写法     }          NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];     // 入池对5.0之前的写法     [pool autorelease];
自动释放池的销毁时间
    当我们将一个对象发送了autorelease消息时,当子自动释放池销毁时,会对池中的每一个对象
发送一条release消息,以此来进行释放它们。
(一):下面来看实例:创建一个Person实例对象,然后加入到自动释放池中,向该实例对象发送一条autorelease消息,
            来查看一下它的生命周期)
  @autoreleasepool {  
        //入池对5.0之后的写法         Person *tom=[[Person alloc]init];         [tom autorelease];         NSLog(@"pool exist");     }      NSLog(@"pool dead");

(二):接着上面的例子,向该对象发送一条retain消息,看下声明周期
      @autoreleasepool {  
        //入池对5.0之后的写法         Person *tom=[[Person alloc]init];  //1         [tom autorelease];         [tom retain];      //2         NSLog(@"pool exist");         NSLog(@"tom %ld",[tom retainCount]);         [tom release];  //1         NSLog(@"tom %ld",[tom retainCount]); 

(三):接着上面的例子,如果有多个自动释放池的问题,根据发送的autorelease消息来进行判断是
      对象加入的那个自动释放池,
     @autoreleasepool {  
        Person *tom=[[Person alloc]init];  //1         @autoreleasepool {         //入池对5.0之后的写法         [tom autorelease];         [tom retain];         NSLog(@"pool exist");         NSLog(@"tom1 %ld",[tom retainCount]);                  }         NSLog(@"pool1 dead");         NSLog(@"tom2 %ld",[tom retainCount]);      }      NSLog(@"pool2 dead");

 
【小结】:
  1:自动释放池的数据结构
     自动释放池是以栈的形式实现,当你创建一个新的自动释放池,它将会被添加到栈顶。接受autorelease
     消息的对象将会呗放入栈顶
  2:如何持有对象
     当我们使用alloccopy,retain对象获取一个对象时,我们需要负责显示的安排对象的销毁,其他方法获取的
     的对象将交给自动释放池进行释放(单例模式除外)
  3releasedrain的区别
     当我们向自动释放池pool发送release消息,将会向池中临时对象发送一条release消息,并且自身也会呗销毁。
     向它发送drain消息时,只会指定前者。

转载于:https://blog.51cto.com/2939716/1376373

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值