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

现在我们有了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管理对象?)