是否可以说名称包含 new、alloc、create 或 copy 的方法不会自动释放它们创建的对象?

StackOverflow https://stackoverflow.com/questions/811547

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

有帮助吗?

解决方案

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

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

*new 将 alloc 和 init 结合到一个方法中。

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

其他提示

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

  

仅“方便”方法使用-autorelease

返回创建的对象

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

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

这一点在 Apple关于内存的在线文档中非常明确地阐述可可管理;你应该彻底阅读这些文件。您在本网站上提出的许多问题都会在那里得到解答,而且它是最权威的来源。

这是正确的。官方消息是 Apple的开发者网站这是针对CoreFoundation的,但它也适用于Cocoa。

几乎。

我不相信“创造”是Apple指南中定义的关键字之一。

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

NSObject *obj = [[someClass alloc]init]; // you are responsible
NSObject *obj = [someClass someConvenientMethod]; // the object is auto-released, you do not own this object

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top