2

据我所知,只有“方便”方法返回带有 -autorelease 的创建对象,因此接收者不负责该对象的内存。但是因为Apple说当你使用一个名称由“new”、“alloc”、“create”或“copy”组成的方法时,你有责任释放方法返回的对象,我认为这些方法应该不 -autorelease 这些对象。否则,它们将是“方便的”,只要接收者不保留接收到的对象,他就根本不负责。我做对了吗?

4

5 回答 5

5

标题中的问题的答案是肯定的,但是:

只有“方便”方法返回带有 -autorelease 的创建对象

这绝对不是真的。假定没有任何一个标记词(或有特定文档另有说明)的任何方法都将返回一个您没有保留引用的对象。便利构造函数当然属于这一类,但 Cocoa 中的大多数其他方法也是如此。

返回一个你不负责释放的对象是 Cocoa 中的规则,而不是例外。

这在Apple 关于 Cocoa 内存管理的在线文档中有非常清楚的说明;你真的应该彻底阅读这些文件。您在本网站上提出的许多问题都已在该网站上得到解答,并且是权威来源。

于 2009-05-01T16:15:21.953 回答
5

经验法则是您拥有(因此必须释放)您拥有的任何对象

  • alloc(使用以“alloc”或“new”开头的方法*)
  • 复制(使用任何包含“复制”一词的方法)
  • 明确地保留自己

*new 将 alloc 和 init 组合成一个方法。

便捷方法返回自动释放的对象。这些在您接收它们的方法的范围内有效,并且可以传递回调用方法(通常)。如果您想保留它们更长的时间,则需要保留它们。

于 2009-05-02T05:50:47.483 回答
1

那是对的。官方的说法是在Apple 的开发者网站This is for CoreFoundation,但它也适用于 Cocoa。

于 2009-05-01T14:46:06.223 回答
1

几乎。

我不认为“创建”是 Apple 指南中定义的关键字之一。

否则你的逻辑是正确的。该方法返回的对象不被该方法的类保留。

NSObject *obj = [[someClass alloc]init]; // you are responsible
NSObject *obj = [someClass someConvenientMethod]; // the object is auto-released, you do not own this object
于 2009-05-01T14:47:51.100 回答
0

查看 Apple 关于对象所有权和处置的文档

于 2009-05-04T02:03:09.853 回答