【问题标题】:Understanding when to call retain on an object?了解何时对对象调用保留?
【发布时间】:2011-05-25 22:31:32
【问题描述】:

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

编辑:

我不是在寻找调试器何时告诉您这样做或这样做。所以,我调查了this

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

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

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

我很困惑。

【问题讨论】:

  • [Objective-C 中的内存管理](stackoverflow.com/questions/106627/…)的可能副本
  • 我认为没有必要对此投反对票。赞成
  • 我对保留感到很困惑。我只是不明白为什么有人会使用它。我试图表达我将如何在我刚刚所做的编辑中使用它..
  • 您的编辑不正确:您永远不应该直接调用 dealloc。而且你也不应该调用两个版本。在方法或类中平衡保留和释放的数量。

标签: iphone cocoa-touch memory-management


【解决方案1】:

您的所有答案都可以在Memory Management Guide 中找到。

编辑

根据您的编辑,这里有一些更具体的细节:

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

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

你使用那个对象

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

然后你想释放它 => 你不能因为你不是所有者

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

看起来你想调用release,因为你认为这是你管理内存的方式,而retain就是你所说的。

这是它应该工作的方式:

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

【讨论】:

  • 优秀的@Abizen。我所需要的。
【解决方案2】:

查看Objective-C beginners guide 了解基本用法

【讨论】:

  • 我知道保留的作用。我不知道什么时候可以正确使用。您提供的链接没有任何解释。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    我的个人意见:如果您想对应用程序的内存管理进行良好的控制,最好明确地保留和销毁您的对象,并尽可能避免自动释放。再次,这是我的个人意见。我喜欢了解我的应用程序中的内存过程,这就是为什么我更喜欢精确地处理它。

    当然这不是最好的方法,每个开发者都会更喜欢使用不同的方法来管理内存。

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

    【讨论】:

    • 谢谢特林卡。似乎必须以与 css z-index 相同的方式使用保留...您希望将元素保持在前面,以便放置一个很大的值。保留是一样的吗?你希望你的对象绝对活着(为什么?不知道!)所以你保留它一两次......??
    • @Marcel 不!当然不。当您希望将对象保留在当前范围之外并释放您拥有的对象时,您将保留它。为了安全起见,您永远不会保留多次。
    • @Marcel - 内存管理是您需要注意的事情。你不需要多次保留一个对象,但你需要跟踪你的应用程序是如何使用这个对象的,因为在任何时候你都需要销毁它并且你必须知道如何去做。或者,一旦它被销毁,何时再次初始化它。请记住,这是为了维护您的应用和系统以安全的方式运行。
    • @kubi weel 说。你认为这是一个很好的现实世界的例子吗?例如,您是否认为 UIViewController 将 retain when 用于其 getter ?在我的应用程序中,如果我说[[self view]release],它会做什么? retain 仅适用于插件/框架开发人员吗?我错过了一个很好的例子
    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2017-08-21
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多