A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhuiyi007 中级黑马   /  2014-7-23 18:53  /  1104 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. autorelease
 给某个对象发送一条autorelease消息时,就会将这个对象加到一个自动释放池中
 当自动释放池销毁时,会给池子里面的所有对象发送一条release消息
 调用autorelease方法时并不会改变对象的计数器,并且会返回对象本身
 autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Release
2. 自动释放池的创建
 ios 5.0后
@autoreleasepool
{
// ....
}
 ios 5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePoolalloc] init];
// .....
[pool release]; // 或[pool drain];
 在程序运行过程中,可以创建多个自动释放池,它们是以栈的形式存在内存中
 OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
3. 应用实例
 跟release的对比
 以前:
Book *book = [[Bookalloc] init];
[book release];
 现在:
Book *book = [[[Bookalloc] init] autorelease];
// 不要再调用[book release];
 一般可以为类添加一个快速创建对象的类方法
+ (id)book {
return [[[Bookalloc] init] autorelease];
}
外界调用[Bookbook]时,根本不用考虑在什么时候释放返回的Book对象
4. 规律
 一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
 比如下面的对象都已经是autorelease的,不需要再release
NSNumber *n = [NSNumbernumberWithInt:100];
NSString *s = [NSStringstringWithFormat:@"jack"];
NSString *s2 = @"rose";

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马