objective-c autorelease

  • 调用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];
注意
  1. 一定要在自动释放池中调用autorelease,就会将对象放入自动释放池
  2. 在自动释放池中创建了对象,一定要调用autorelease才会把对象放入自动释放池
  3. 只要在自动释放池中调用了autorelease,就会将对象放入自动释放池,即使是在自动释放池外声明了对象
  4. 一个程序可以创建N个自动释放池,并且还可以嵌套
  5. 不要对一个对象写多个autorelease,一个retain对应一个release/autorelease
  6. 不要在自动释放池中使用比较耗内存的对象
  7. 尽量不要再自动释放池中使用循环,尤其是循环次数很多的

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

你可能感兴趣的:(objective-c autorelease)