1

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

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

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

4

3 回答 3

3

实际上,这几乎是正确的。 alloc, new, 并copy为您提供返回对象的所有权。这些是类方法。其他类方法应该返回一个自动释放的对象。实例方法也应该返回一个自动释放的对象。

init不影响所有权,应与alloc以下内容结合使用。

[[SomeCoolClass alloc] init]

new通常与上述相同,有时被描述为“几乎已弃用”,因为它是对 NeXT 时代的回归,当时分配和初始化是在同一步骤中完成的,并且无法像我们今天使用allocand那样分开绘制init

释放不会影响所有权,但只能用于您已经拥有的对象。否则很可能会发生崩溃。

Retain 也不会影响所有权,但只能用于您已经拥有的对象。否则,对象可能不会在应该被释放的时候被释放。结果可能是崩溃,但也可能是非常非常奇怪的行为,很难排除故障,因为消息可能会发送到应该已被释放的原始对象,而不是指向同一地址的新对象。

于 2011-12-12T20:31:44.137 回答
3

是的,这适用于类方法,因为alloc并且new是将所有权返回给调用者的类方法。copyor的前缀mutableCopy应该用于返回所有权的实例方法。

编辑更新:

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

于 2011-12-12T20:24:29.793 回答
3

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

如果您正在命名任何类方法initcopy或者retain,您应该停止它。这些方法仅在实例上下文中才有意义。 alloc并且new是类方法,只能在该上下文中使用。不要命名实例方法allocnew.

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

于 2011-12-12T20:29:25.883 回答