美文网首页iOS OC 学习手册
为何OC工厂方法要用@autorelease管理对象?

为何OC工厂方法要用@autorelease管理对象?

作者: Nicholasty | 来源:发表于2017-08-20 23:31 被阅读19次

    现在我们有了ARC(自动引用计数)都不用手动对一个对象发送release,retain,autorelease消息了,但其实是编译器帮我们做了这些事情。所以要学习OC的内存管理机制,这几个关键字是逃不掉的。本文重点讲一下autorelease

    autorelase基本概念

    对一个对象发送autorelase意思就是我不想再继续持有该对象,但又不能立即释放它(发送release方法),于是就扔给autoreleasePool(自动释放池)管理。这里我们先不管这个池怎么管理的,这不是本文重点。

    实例分析

    先来看下面代码:

    +(Person *)person {
        Person *person = [[Person alloc]init];
        [person autorelease]; //ARC环境下不需要手动添加;
        return person;
    }
    

    这个是在MRC环境下创建工厂方法的正确方式。为什么在创建对象后要发送autorelease呢?
    这里我们需要知道一点:调用方只有调用alloc/new/copy/mutableCopy 或以这些关键字为首的以驼峰命名,如allocObject/copyTheObj等方法生成的对象才能持有该对象。
    综上所述,如果使用Person *p = [Person person]创建一个Person对象我们是没有持有该对象的!也就是说我们不能使用[p release]释放对象。而在person方法中我们用了alloc创建对象,所以持有了该对象,对象引用计数为1,但我们在person方法又无法知道应该在哪个时机释放对象,所以只好调用autorelease,委托autoreleasePool帮我们释放对象了。

    相关文章

      网友评论

        本文标题:为何OC工厂方法要用@autorelease管理对象?

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