这增加了保留计数:alloc还是init?

时间:2012-04-20 21:02:27

标签: objective-c init retaincount alloc

当我们需要创建一个对象并取得它的所有权时,我们写

NSObject *someObject = [[NSObject alloc] init];

之后someObject的保留计数将等于1.哪种方法会增加计数,allocinit,以及Apple文档中描述此行为的位置?

3 个答案:

答案 0 :(得分:11)

alloc方法执行实际分配通常会增加保留计数。 init负责在分配后初始化对象。

* 在几个基础类和第三方代码(例如类集群)中都有例外情况,但是在调用之后你始终有责任调用release / autorelease。手动内存管理中的alloc

答案 1 :(得分:10)

  

之后someObject的retainCounter将等于1.问题是   在Apple中哪个方法增加了retainCounter alloc或init   docs描述了这种行为吗?

“无论是”,“两者”还是“一个或另一个”都是正确的答案。一个更好的答案是“它是一个实现细节,你需要关注一般的,非实现依赖规则”。

首先,抛弃绝对保留计数的概念。想到这一点是一种无用的方式。

+alloc返回一个+1保留计数的对象。 +alloc返回的任何内容都必须-release d。实际保留计数是否为1是否完全是一个实现细节,对于许多Apple类来说,它通常 1。

-init使用messaged对象的保留计数,并生成一个保留计数+1的对象(不是1,而是“加1”); <{1}}返回的结果必须init d才能正确管理。

release通常只调用init而不在内部操纵保留计数。这保留了上述规则。

有时它不会,这就是为什么你总是必须在初始化器中使用return self;(当然要检查返回值)为什么你永远不应该做某事比如self = [super init]

答案 2 :(得分:5)

嗯,所以它有点复杂。对于几乎所有情况,+alloc会增加保留计数,而-init对保留计数不执行任何操作。

但偶尔,-init会希望返回一个预先存在的对象,而不是初始化传递它的空白alloc。 (例如,NSNumber执行此操作。)在这种情况下,-init会释放self,然后返回一个+1保留计数的新对象。

在ARC文档中,他们说-init是一种“消耗”其收件人的方法,并返回一个保留的对象。通常,这只意味着init对保留计数没有任何作用。但有时,-init实际上正在做一些保留。

如果这让您感到困惑,请不要担心。

正如我所说,+alloc是保留的人。保证-init返回一个保留的对象,但在大多数情况下它本身不会保留。