我正在重新阅读《Cocoa编程》这本书的前几章,作者指出NSCalendarDate
的一个类方法返回一个自动释放对象。我一直以为所有的类方法都会返回自动释放对象(因为没有涉及到alloc
)。
是否有任何需要特别保留的类方法?
谢谢。
我正在重新阅读《Cocoa编程》这本书的前几章,作者指出NSCalendarDate
的一个类方法返回一个自动释放对象。我一直以为所有的类方法都会返回自动释放对象(因为没有涉及到alloc
)。
是否有任何需要特别保留的类方法?
谢谢。
类方法和实例方法一样,应遵守标准的Cocoa内存管理规则。
如果使用以“alloc”或“new”开头或包含“copy”的方法(例如,alloc,newObject或mutableCopy)创建对象,或者发送保留消息,则会获取该对象的所有权。您负责使用release或autorelease放弃您拥有的对象的所有权。在任何其他时候,您接收到一个对象,就不应该释放它。
可以假定它们返回了一个自动释放的对象,或者是一个单例的引用或类似的东西。无论哪种方式,除非它以“alloc”或“new”开头或包含“copy”,否则您无需释放该对象。除非您希望将其存储在iVar中等以超出当前自动释放池的范围保留它,否则无需保留它。
stringWithUTF8String:
),类不打算拥有该实例,因此它会自动释放它。 - Peter Hosey便利方法通常返回自动释放的对象。例如,[NSMutableArray array] 等同于 [[[NSMutableArray alloc] init] autorelease]。
这些是类方法,并不意味着所有类方法都返回自动释放的对象。这取决于命名约定。如果方法有 alloc*、copy、new* 名称,则您将成为返回对象的所有者。也就是说,当传递给您时,它的保留计数至少为 1。
值得记住的是,类方法不必返回对象 - 任何方法都可以返回任何东西(包括结构体、基本类型等)或什么也不返回(void)。Objective-C语言中没有要求类方法返回未拥有的对象(意味着调用者不需要释放/自动释放它)。
话虽如此,@Joey的回答很好。对于返回对象的类方法,经验法则是应该自动释放。为了避免在客户端代码中引起内存泄漏,应清楚地记录违反惯例的情况。
一般规则是,如果方法的名称中包含alloc、new或copy,则表示你拥有它。否则,它可能是自动释放的,或者由其他人负责处理,即你不拥有它,因此不必担心。