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

Ros*_*nko 4 objective-c init alloc retaincount

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

NSObject *someObject = [[NSObject alloc] init];
Run Code Online (Sandbox Code Playgroud)

之后,someObject保留计数将等于1.哪种方法会增加计数,alloc或者init,在Apple的文档中,这种行为的描述是什么?

Joe*_*Joe 11

alloc因此,实际分配的方法通常会增加保留计数.该init负责分配后初始化的对象.

*在几个基础类和第三方代码(例如类集群)中都有例外情况,但是您总是负责在手动内存管理中调用release/ autorelease调用alloc


bbu*_*bum 10

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

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

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

+alloc返回具有+1保留计数的对象.无论返回什么,都+alloc必须在-release某处.实际保留计数是否为1是否完全是一个实现细节,对于Apple的许多类而言通常不是 1.

-init使用消息对象的保留计数并生成一个保留计数+1的对象(不是1,而是"加1"); 返回的结果init必须release正确管理.

通常,init只是在return self;没有内部操作保留计数的情况下调用.这保留了上述规则.

但是,有时它并不会导致您self = [super init]在初始化程序中始终必须拥有(当然要检查返回值)以及为什么不应该执行类似的操作Foo *f = [Foo alloc]; [f init];.


BJ *_*mer 5

好吧,所以它有点复杂.对于几乎所有情况,+alloc增加保留计数,并且对保留计数-init不执行任何操作.

但偶尔-init会想要返回一个预先存在的对象而不是初始化alloc通过它的空白对象.(NSNumber例如,这样做.)在这种情况下,-init将释放self,然后返回具有+1保留计数的新对象.

在ARC文档中,他们说这-init是一种"消费"其接收者并返回一个保留对象的方法.通常,这只意味着init对保留计数没有任何作用.但有时,-init实际上是做了一些保留.

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

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