所有的类方法都会返回一个自动释放的对象吗?

3

我正在重新阅读《Cocoa编程》这本书的前几章,作者指出NSCalendarDate的一个类方法返回一个自动释放对象。我一直以为所有的类方法都会返回自动释放对象(因为没有涉及到alloc)。

是否有任何需要特别保留的类方法?

谢谢。


1
从技术上讲,如果一个方法没有返回一个自动释放的对象,你就不必保留结果。它要么已经被保留,要么代码可能存在错误,以至于返回的对象可能已经被释放。 - Chuck
4个回答

22

类方法和实例方法一样,应遵守标准的Cocoa内存管理规则

如果使用以“alloc”或“new”开头或包含“copy”的方法(例如,alloc,newObject或mutableCopy)创建对象,或者发送保留消息,则会获取该对象的所有权。您负责使用release或autorelease放弃您拥有的对象的所有权。在任何其他时候,您接收到一个对象,就不应该释放它。

可以假定它们返回了一个自动释放的对象,或者是一个单例的引用或类似的东西。无论哪种方式,除非它以“alloc”或“new”开头或包含“copy”,否则您无需释放该对象。除非您希望将其存储在iVar中等以超出当前自动释放池的范围保留它,否则无需保留它。


4
澄清一点:对于单例, 拥有其唯一的实例,这就是为什么它不会释放或自动释放它。在所有其他情况下(通常是便捷的工厂方法,如 stringWithUTF8String:),类不打算拥有该实例,因此它会自动释放它。 - Peter Hosey
1
为了强调Joey所说的 - 你唯一关心的是对象所有权,正如Cocoa内存管理规则所述。问题是“我是否拥有返回的对象”,而不是“我调用的方法是否将其自动释放”。 - Jim Correia
+1 对于一个好的答案。请查看我的回答以获取一些额外的分析。 - Quinn Taylor

1

便利方法通常返回自动释放的对象。例如,[NSMutableArray array] 等同于 [[[NSMutableArray alloc] init] autorelease]。

这些是类方法,并不意味着所有类方法都返回自动释放的对象。这取决于命名约定。如果方法有 alloc*、copy、new* 名称,则您将成为返回对象的所有者。也就是说,当传递给您时,它的保留计数至少为 1。


1

值得记住的是,类方法不必返回对象 - 任何方法都可以返回任何东西(包括结构体、基本类型等)或什么也不返回(void)。Objective-C语言中没有要求类方法返回未拥有的对象(意味着调用者不需要释放/自动释放它)。

话虽如此,@Joey的回答很好。对于返回对象的类方法,经验法则是应该自动释放。为了避免在客户端代码中引起内存泄漏,应清楚地记录违反惯例的情况。


0

一般规则是,如果方法的名称中包含alloc、new或copy,则表示你拥有它。否则,它可能是自动释放的,或者由其他人负责处理,即你不拥有它,因此不必担心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接