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

时间:2009-09-04 09:39:52

标签: iphone objective-c cocoa memory-management

我正在重读Mac OS X的Cocoa Programming的前几章,作者指出NSCalendarDate的一个类方法返回一个自动释放的对象。我总是假设所有类方法都返回了一个自动释放的对象(因为没有涉及alloc)。

您是否有必须专门保留的课程方法?

感谢。

4 个答案:

答案 0 :(得分:22)

类方法与实例方法一样,应遵循标准Cocoa memory management rules

  

如果您拥有对象的所有权   使用名称为的方法创建它   以“alloc”或“new”开头   包含“复制”(例如,alloc,   newObject,或mutableCopy),或者如果你   发送一条保留信息。你是   负责放弃   您拥有的对象的所有权   释放或自动释放。任何其他时间   你收到一个物品,你绝对不能   释放它。

据推测,他们正在返回一个自动释放的对象,或者对单例或类似内容的引用。无论哪种方式,您都不需要释放对象,除非它以“alloc”或“new”开头或包含“copy”。您不需要保留它,除非您希望将其保留在当前自动释放池的范围之外,方法是将其存储在iVar或类似的内容中。

答案 1 :(得分:1)

便捷方法通常返回自动释放的对象。例如。 [NSMutableArray数组]相当于[[[NSMutableArray alloc] init] autorelease]。

这些是类方法的事实,不应该导致您得出所有类方法返回自动释放对象的结论。这都是关于命名约定的。如果menthod有一个alloc *, copy ,new * name,那么你将成为返回对象的所有者。即传递给你时,它的保留数至少为1。

答案 2 :(得分:1)

值得记住的是,类方法根本没有来返回一个对象 - 任何方法都可以返回任何(包括结构,原始类型等)或者没有(无效)。 Objective-C语言中没有任何内容要求类方法返回无主对象(意味着调用者不需要释放/自动释放它)。

那就是说,@ Joey的答案很棒。返回对象的类方法的经验法则是它应该被自动释放。应明确记录与约定的中断,以避免在客户端代码中导致内存泄漏。

答案 3 :(得分:0)

一般规则是,如果方法的名称包含alloc,new或copy,那么您拥有它。否则它可能是自动释放的,或由其他人照顾,即你不拥有它,所以你不必担心它。