是否可以说名称包含 new、alloc、create 或 copy 的方法不会自动释放它们创建的对象?
-
03-07-2019 - |
题
据我所知,只有“方便”方法返回带有 -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的文档对象所有权和处置
不隶属于 StackOverflow