- 调用autorelease会给对象发送一个消息,将对象放在自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
- autorelease会返回对象本身
ClassName *p = [ClassName alloc] init];
p = [p autorelease];
- 调用autorelease方法后,对象的计数器不变
- 原理
- 实际上只是把release的调用延迟,对于每一个autorelease,系统只是把该对象放在了自动释放池中,在池被释放的时候,池中的所有类将会被释放
自动释放池第一种方式,最常用的方式
@autoreleasepool{//创建一个自动释放池
ClassName *p = [[ClassName alloc] init] autorelease];
}//销毁一个自动释放池
自动释放池第二种方式,被淘汰
NSAutorelease *pool = [[NSAutorelease alloc] init];
ClassName *p = [[ClassName alloc] init] autorelease];
[pool release];
注意
- 一定要在自动释放池中调用autorelease,就会将对象放入自动释放池
- 在自动释放池中创建了对象,一定要调用autorelease才会把对象放入自动释放池
- 只要在自动释放池中调用了autorelease,就会将对象放入自动释放池,即使是在自动释放池外声明了对象
- 一个程序可以创建N个自动释放池,并且还可以嵌套
- 不要对一个对象写多个autorelease,一个retain对应一个release/autorelease
- 不要在自动释放池中使用比较耗内存的对象
- 尽量不要再自动释放池中使用循环,尤其是循环次数很多的
autorelease类工厂方法和构造方法
//一个类一定要提供一个类工厂方法和构造方法,并且使用上autorelease,以简便别人的代码
//类工厂方法
+ (instancetype)classname
{
return [[[self alloc] init] autorelease];
}
//构造方法
- (instancetype)initWithInfo:(type)info
{
//先初始化父类
if(self = [super init])
{
_info = info;
}
return self;
}
//类工厂方法
+ (instancetype)classnameWithInfo:(type)info
{
return [[self alloc] initWithInfo:info] autorelease];
}
注意
Foundation框架的类,但凡是通过类工厂方法创建的对象都是autorelease