2011-12-12 41 views
1

首先,我是一个Objective-C的新手。 :)Objective-C,所有权和类方法

我知道任何以alloc,newcopy开头的东西都会给返回对象的调用者所有权。这是否也适用于类方法?我猜测它确实是,最近一次我的单元测试崩溃似乎证实了它。 Apple的高级内存管理编程指南不会说类和实例方法之间是否有区别。

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

+0

你是指为你生成一个对象的类方法吗? 当然可以。这种模式是obj-c中内存管理的一个关键。即使非苹果框架适用于这种模式。 – yinkou

回答

3

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

编辑进行更新:

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

+0

@JeffWolski:苹果的编程指南明确提到'拷贝'(和变体)作为赋予所有权的方法。看到这里:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html –

3

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

如果您正在命名任何类方法init,copyretain,您应该停止该方法。那些只是在实例环境中才有意义的方法。 allocnew是类方法,只能在该上下文中使用。不要命名实例方法allocnew

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

+0

是的,我混合init与新! :) –

3

实际上,这几乎是正确的。 alloc,newcopy给你返回对象的所有权。这些是类方法。其他类方法应该返回一个自动释放对象。实例方法也应该返回一个自动释放对象。

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

[[SomeCoolClass alloc] init] 

new通常是同样的事情之上,并且有时被描述为“几乎过时”,因为它是一个倒退到当分配和初始化在同一步骤中完成,不能情节接下来的日子里除了今天我们用allocinit

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

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