了解何时调用保留在对象上?

时间:2010-12-15 13:56:08

标签: iphone cocoa-touch memory-management

什么时候应该使用retain?我知道它增加了对象引用计数,所以基本上该对象上的下一个release将不会在其上调用dealloc。好的,那又怎样?我读到这是一种惯例,如果你关心一个物体,你retain它。那里有什么例子吗?这是真的吗?

修改

我不是在寻找调试器告诉你这样做的时候。所以,我调查了this

用我的话来说,这是一个retain用法

的例子
  • 在你的代码中,你在某处调用一个方法,该方法返回一个你不拥有的对象
  • 您使用该对象
  • 然后你要释放它=> 你不能,因为你不是主人
  • 您的解决方案是使用copyretain。如果您使用retain,那么您将获得该对象的所有权。
  • 然后要发布该对象,您要么执行2 release(因为保留时引用计数为1 + 1)或直接使用dealloc
是吗?我不这么认为,因为一个对象可以拥有多个所有者。所以对于最后一点,调用dealloc将真正“杀死”该对象;但是使用2 release,你不会是所有者,但是创建它的程序仍然是,因此对象在某个地方仍然存在(泄漏?僵尸?)

我很困惑。

4 个答案:

答案 0 :(得分:6)

您的所有答案都可以在Memory Management Guide

中找到

修改

在您编辑之后,这里有一些更具体的细节:

  

在你的代码中,你在某个地方调用一个方法,该方法返回一个你不拥有的对象

因为你不拥有它,所以你无法控制它的生命周期。它可以在您仍然依赖它作为有效对象时释放。

  

您使用该对象

永远不要确定它会存在。

  

然后你要释放它=>你不能,因为你不是主人

但你为什么要发布呢?您不拥有该对象,因此您不对其内存管理负责。

看起来好像要调用release,因为您认为这是您管理内存的方式,retain就是让您称呼它。

以下是它的工作方式:

  • 您调用返回对象的方法。如果您未通过致电allocnewcopymutableCopy收到此对象,那么根据您不拥有该对象的Memory Management Guide,所以你不负责管理这段记忆。
  • 在大多数情况下,您可以假设您已经传递了自动释放的对象。这意味着你无法控制它的生命周期。要确保在完成之前不会释放它,请在对象上调用retain。您现在拥有此对象,并负责在将来的某个时间调用release。现在关注对象的保留计数是一个初学者的错误。不要。重要的是,您有责任在其上致电release
  • 使用该对象时请记住一般的内存管理范例。例如,如果将此对象添加到NSArray,则数组将保留该对象。
  • 一旦完成了对象所需的操作,就可以在其上调用release。再次。不要关心对象的保留计数,或者使用此对象的其他对象。重要的是,您通过拨打retain的同等数量来调整release的来电。

答案 1 :(得分:1)

我通常只在需要时显式使用retain,并且Xcode调试器告诉我在出现这种情况时刚刚发生了什么。通常无论出于何种原因(开发人员管理不善或幕后发布了一些版本),您对已发布的对象执行任何操作,都会导致崩溃。只需阅读控制台上的日志,在调试时查看Xcode上的调试器,你通常会找出导致问题的对象。

答案 2 :(得分:0)

Marcel,内存管理是开发iOS应用程序的关键点。 您应该考虑按照其他人的建议阅读有关它的Apple文档。

我可以在这里添加一些信息,以帮助您满足您的需求。

使用Obj-C的内存管理过程是计数基础。这意味着只要您“保留”某个对象,系统就会改进此对象的计数器。例如,如果您创建一个按钮并“保留”它,它将具有值1.如果再次保留它,它将具有值2.要完全销毁此对象,您需要将其释放两次。 只要对象的值为0,它就会被销毁。

我的个人观点:如果您希望对应用程序的内存管理有一个很好的控制,最好明确保留和销毁您的对象,尽可能避免自动释放。再次,这是我的个人意见。我想知道我的应用程序内部的内存过程,这就是为什么我更愿意精确地处理这个问题。

当然,这不是最佳方式,每个开发人员都倾向于使用不同的方法来管理内存。

再次:花些时间阅读Abizem建议你的文档。当然你会对它有更好的了解。

答案 3 :(得分:-1)

检查Objective-C beginners guide的基本用法