当前位置: 代码迷 >> 综合 >> autorelease
  详细解决方案

autorelease

热度:52   发布时间:2023-12-14 18:48:38.0
  • 调用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

  相关解决方案