在我不知情的情况下,我对一些被自动释放的物体感到有些恼火。它们可能是一件好事,但如果它们是,我想知道。文档没有说明哪些方法是自动释放对象,所以我通常会测试我的前进方向,这在我看来是愚蠢的。例如,[NSDate date]自动释放对象,[NSArray arrayWithObjects:...]也是如此。如果没有文件告诉你,你怎么知道?
我开始看到一个模式虽然像这样的方法,那些用静态函数创建对象的方法总是返回自动释放的对象。这总是如此吗?
答案 0 :(得分:21)
基本上,如果您init
,copy
或retain
您负责释放它。如果不这样做,则不负责发布它。
许多类提供了方法 form + className ...你可以使用 获取该类的新实例。 通常被称为“便利性” 构造函数“,这些方法创建了一个 该类的新实例,初始化 它,并返回给你使用。 虽然你可能认为你是 负责释放物品 以这种方式创造,但事实并非如此 根据所有权的情况 政策早先提出。因为 class创建了新对象 负责处理新的 对象
答案 1 :(得分:4)
方法签名本身告诉你。具有“classNameWithData:data1:data2”等签名的方法的模式是返回该东西的alloc / init / autorelease实例。它们是方便的,所以你不必这样做。
如果你不想要某个东西的自动释放版本,那么不要那样实例化它们,并使用正确的alloc / init,并在你完成后释放。这种方法更明确,更容易出错,因为如果抛出异常,你的发布块可能会被遗漏,但这就是你为这种方式付出的代价。