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