Objective-C,所有权和类方法

时间:2011-12-12 20:20:47

标签: objective-c release ownership class-method

首先,我是Objective-C的新手。 :)

我了解到,以allocnewcopy开头的任何内容都会为返回的对象提供调用者所有权。这也适用于类方法吗?我猜它确实,最近我的一个单元测试中的崩溃似乎证实了这一点。 Apple的高级内存管理编程指南没有说明类和实例方法之间是否存在差异。

更新 我的意思是它也适用于类方法实际上是“逆”。例如,NSDecimalNumber有一个名为+decimalNumberWithDecimal:的类方法。它似乎返回一个自动释放的对象(如果我明确地释放它,之后不久就会发生崩溃)。事后看来,我的问题的答案显而易见,因为Apple的指南将newalloc称为所有权授予方法,而且它们都是类方法。抱歉占用宝贵的时间。 :)

3 个答案:

答案 0 :(得分:3)

是的,这适用于类方法,因为allocnew是将所有权返回给调用者的类方法。 copymutableCopy的前缀应该用于返回所有权的方法。

编辑更新:

你是正确的,像+decimalNumberWithDecimal:这样的方法应该返回一个自动释放的对象,因此没有理由释放它。但是,如果他们决定命名方法+newNumberWithDecimal:,那么您将获得返回对象的所有权并需要释放它。如果您使用new为方法添加前缀并返回自动释放的对象,Clang静态分析器实际上会抱怨。

答案 1 :(得分:3)

allocreleaseinit并不表示所有权,您可能会将其与alloc混合起来。您可以使用助记符 NARC 轻松记住它。

如果您要命名任何类方法initcopyretain,则应该停止此操作。这些方法只在实例的上下文中有意义。 allocnew是类方法,只应在该上下文中使用。请勿命名实例方法allocnew

指南没有说它适用于实例方法和类方法的原因是所讨论的方法显然是两者的混合,所以显然就是这种情况。

答案 2 :(得分:3)

实际上,这几乎是正确的。 allocnewcopy授予您返回对象的所有权。这些是类方法。其他类方法应该返回一个自动释放的对象。实例方法还应该返回一个自动释放的对象。

init不影响所有权,应与alloc一起使用,如下所示。

[[SomeCoolClass alloc] init]

new通常与上面的内容相同,有时会被描述为“几乎已弃用”,因为它是对NeXT日的回归,当时分配和初始化是在同一步骤中完成的,并且无法绘制与今天allocinit一样。

发布不会影响所有权,但只应在您已拥有的对象上使用。否则可能会发生崩溃。

保留也不会影响所有权,但只应在您已拥有的对象上使用。否则,对象可能无法解除分配。结果可能是崩溃,但它也可能是非常奇怪的行为,难以排除故障,因为消息可能被发送到原本应该被解除分配的对象而不是指向同一地址的新对象。 / p>