objective-c中的autorelease


一、autorelease基本用法

1.给某个对象 发送一条autorelease消息时,就会将这个对象加到一个自动释放池中
2. 当自动释放池销毁时,会给池子里面的所有对象发送一条release消息
3 . 调用autorelease方法时并不会改变对象的计数器,并且会返回对象本身
4. autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Release

二、自动释放池的创建

 ios 5.0后

@autoreleasepool

{

    // ....

}

ios 5.0前

NSAutoreleasePool *pool = [[NSAutoreleasePoolalloc]init];

// .....

[pool release]; // [pool drain];

  在程序运行过程中,可以创建多个自动释放池,它们是以栈的形式存在内存中

 OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)

三、应用实例

跟release的对比

以前:

 

Book *book = [[Book alloc] init];
[book release];

现在:

Book *book = [[[Book alloc] init] autorelease];
// 不要再调用[book release];


一般可以为类添加一个快速创建对象的类方法

+ (id)book {
    return [[[Book alloc] init] autorelease];
}

外界调用[ Book book]时,根本不用考虑在什么时候释放返回的Book对象。

四、规律

1.   一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease

2.   比如下面的对象都已经是autorelease的,不需要再release

NSNumber *n = [NSNumber numberWithInt:100];
NSString *s = [NSString stringWithFormat:@"jack"];
NSString *s2 = @"rose";


3. 占用内存较大的对象,不要随便使用autorelease。最好用release精确控制。占用内存较小的对象,使用autorelease没有太大影响



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值