我正在重读Mac OS X的Cocoa Programming的前几章,作者指出NSCalendarDate
的一个类方法返回一个自动释放的对象。我总是假设所有类方法都返回了一个自动释放的对象(因为没有涉及alloc
)。
您是否有必须专门保留的课程方法?
感谢。
答案 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,那么您拥有它。否则它可能是自动释放的,或由其他人照顾,即你不拥有它,所以你不必担心它。