美文网首页
objective-c autorelease

objective-c autorelease

作者: 一世长安乱 | 来源:发表于2018-04-10 16: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

    相关文章

      网友评论

          本文标题:objective-c autorelease

          本文链接:https://www.haomeiwen.com/subject/easnhftx.html