首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解何时对对象调用retain?

了解何时对对象调用retain?
EN

Stack Overflow用户
提问于 2010-12-15 13:56:08
回答 4查看 1K关注 0票数 6

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

编辑:

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

用我的话来说,下面是一个retain用法的例子

  • 在代码中,您可以调用一个方法--一个返回不属于的对象的方法
  • 你用那个物体
  • 然后你想释放它,=>,,你不能,因为你不是所有者
  • 您的解决方案是使用copyretain。如果您使用retain,那么您将获得该对象的所有权。
  • 然后,要释放该对象,可以执行2 release (因为ref计数在保留时是1+1 ),或者直接在其上使用dealloc

是这样吗?我不这么认为,因为一个对象可以有多个所有者。因此,对于最后一点,调用dealloc将真正“杀死”对象;但是使用2 release,您将不会成为所有者,但是创建它的程序仍然是,因此对象在某个地方仍然是活动的(泄漏?僵尸?)

求你了我很困惑。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-15 14:03:54

您的所有答案都在内存管理指南中找到。

编辑

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

在您的代码中,您可以调用一个方法--一个返回您不拥有的对象的方法

因为你不拥有它,你无法控制它的一生。它可以在您仍然依赖于它是一个有效的对象时释放。

你用那个物体

永远不要确定它是否会存在。

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

但你为什么要释放它?你不拥有这个对象,所以你不负责它的内存管理。

似乎您想要调用release,因为您认为这就是您管理内存的方式,而retain就是我们所称的。

它的工作方式如下:

  • 调用返回对象的方法。如果您还没有通过调用allocnewcopymutableCopy来接收该对象,那么您并不拥有该对象,因此您不必负责管理这个内存。
  • 在大多数情况下,您可以假设已经传递了一个自动释放对象。这意味着你无法控制它的一生。为了确保它在完成之前不会被释放,您可以在对象上调用retain。您现在拥有这个对象,并在将来的某个时候负责在它上调用release。现在关注对象的保留数是初学者的错误。不要这样。重要的是,您负责调用release
  • 在使用对象时,要记住一般内存管理范例。例如,如果将此对象添加到NSArray中,则数组将保留该对象。
  • 一旦完成了您需要对对象所做的操作,就可以在其上调用release。再来一次。不要担心对象的保留计数,或者其他对象使用该对象的情况。重要的是,您已经平衡了对retain的调用和对release的相同数量的调用。
票数 6
EN

Stack Overflow用户

发布于 2010-12-15 14:04:20

当有必要时,我通常只显式地使用retain,Xcode调试器告诉我在出现这种情况时发生了什么。通常,不管出于什么原因(开发人员的管理不善,或者在幕后发布了一些版本),您对发布的对象做任何事情都会导致崩溃。只需在控制台上读取日志,调试时就可以看到Xcode上的调试器,并且您通常会发现是哪个对象导致了问题。

票数 1
EN

Stack Overflow用户

发布于 2010-12-15 14:29:40

Marcel,内存管理是开发iOS应用程序的关键。你应该像其他人建议的那样,阅读苹果的相关文档。

我可以在这里添加一些信息,试图帮助你满足你的需要。

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

我个人的观点是:如果你想对你的应用程序的内存管理有一个很好的控制,最好是明确地保留和销毁你的对象,在可能的时候避免自动释放。再说一次,这是我个人的意见。我喜欢了解我的应用程序中的内存过程,这就是为什么我更喜欢精确地处理这个问题。

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

再次:花点时间阅读Abizem建议的文档。当然,你会对它有一个更好的理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4450644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档