16

我对某些对象在我不知情的情况下被自动释放感到有点恼火。他们可能是一件好事,但如果他们是,我想知道。文档没有说明哪些方法可以自动释放对象,所以我通常会测试我的前进方式,在我看来这很愚蠢。例如,[NSDate date] 自动释放对象,[NSArray arrayWithObjects:...] 也是如此。如果没有文件告诉你,你怎么知道?

我开始看到一种模式,尽管像这样的方法,使用静态函数创建对象的方法,总是返回自动释放的对象。这总是正确的吗?

4

2 回答 2

20

基本上,如果您initcopyretain一个对象,您有责任释放它。如果你不这样做,你不负责发布它。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

许多类提供 +className... 形式的方法,您可以使用这些方法来获取该类的新实例。通常被称为“便利构造函数”,这些方法创建一个类的新实例,初始化它,然后返回给你使用。尽管您可能认为您有责任释放以这种方式创建的对象,但根据前面列出的所有权策略,情况并非如此。因为类创建了新对象,所以它负责处理新对象。

于 2009-09-23T15:32:11.603 回答
4

方法签名本身会告诉你。具有“classNameWithData:data1:data2”等签名的方法的模式是返回该事物的 alloc/init/autorelease 实例。它们在那里很方便,因此您不必这样做。

如果你不想要某个东西的自动释放版本,那么不要以这种方式实例化它们,并使用正确的 alloc/init,并在完成后释放。这种方法更加明确,并且更容易出错,因为如果抛出异常,您的发布块可能会丢失,但这是您为这种方式付出的代价。

于 2009-09-23T15:18:51.633 回答