———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
1.autorelease的基本用法
。会将对象放到一个自动释放池中
。当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
。会返回对象本身
。调用完autorelease方法后,对象的计数器不变
2.autorelease的好处
。不用关心对象释放的时间
。不用关心什么时候调用release
3.autorelease的使用注意
。占用内存较大的对象不要随便使用autorelease
。占用内存较小的对象使用autorelease,没有太大影响
4.错误写法
。alloc之后调用了autorelease,又调用release
@autoreleasepool
{
Person *p = [[[Person alloc] init] autorelease];
[p release];//野指针错误
}
。连续调用多次autorelease
@autoreleasepool
{
Person *p = [[[[Person alloc] init] autorelease] autorelease];//野指针错误
}
5.自动释放池
。在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构存在(先进后出)
。当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
6.自动释放池的创建方式
。iOS5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Person *pp = [[[Person alloc] init] autorelease];
[pool release];//或[pool drain]
。iOS5.0后
@autoreleasepool
{
Person *p = [[[[Person alloc] init] autorelease] autorelease];
}
规律
1.系统自带的方法里面没有包含alloc、new、copy、说明返回的对象都是autorelease的
比如下面的对象都已经是autorelease的,不需要再release
NSNumber *n = [NSNumber numberWithInt:100];
NSString *s = [NSString stringWithFormat:@"jack"];
NSString *s2 = @"rose";
2.开发中经常会提供一些类方法,快速返回一个创建好的对象,并且是autorelease
创建对象时不要直接用类名,一般用self
+ (id)person
{
return [[[self alloc] init] autorelease];
}
外界调用[Person person]时,根本不用考虑在什么时候释放返回的Person对象
注:autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Release
在程序运行过程中,可以创建多个自动释放池,它们是以栈的形式存在内存中
OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
应用实例
跟release的对比
以前:
Book *book = [[Bookalloc]init];
[book release];
现在:
Book *book = [[[Bookalloc]init]autorelease];
// 不要再调用[book release];