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

Iphone 了解何时对对象调用retain?,iphone,cocoa-touch,memory-management,Iphone,Cocoa Touch,Memory Management,什么时候应该使用retain?我知道它会增加对象引用计数,因此基本上该对象上的下一次发布不会对其调用dealloc。很好,那又怎样?我听说这是一种惯例,如果你关心一个对象,你就会保留它。有这样的例子吗?这是真的吗 编辑: 我不是在寻找调试器何时告诉您这样做或这样做。所以,我调查了一下 用我的话说,这里有一个retain用法的例子 在代码中,您可以在某个地方调用一个方法,该方法返回一个您不拥有的对象 你在用那个东西吗 然后你想释放它=>你不能释放它,因为你不是所有者 您的解决方案是使用复制或保留

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

编辑:

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

用我的话说,这里有一个
retain
用法的例子

  • 在代码中,您可以在某个地方调用一个方法,该方法返回一个您不拥有的对象
  • 你在用那个东西吗
  • 然后你想释放它=>你不能释放它,因为你不是所有者
  • 您的解决方案是使用
    复制
    保留
    。如果用户保留,则您将获得该对象的所有权
  • 然后要释放该对象,您可以执行2
    release
    (因为保留时ref count是1+1),或者直接对其使用
    dealloc
是这样吗?我不这么认为,因为一个对象可以有多个所有者。最后一点,调用
dealloc
将真正“杀死”对象;但是有了2
release
,您将不再是所有者,但创建它的程序仍然是所有者,因此对象仍然存在于某个地方(泄漏?僵尸?)


请告诉我,我很困惑。

您所有的答案都可以在中找到

编辑

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

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

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

你在用那个东西吗

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

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

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

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

以下是它的工作方式:

  • 调用一个返回对象的方法。如果您尚未通过调用
    alloc
    new
    copy
    mutableCopy
    收到此对象,则根据您不拥有该对象,因此您不负责管理此内存
  • 在大多数情况下,您可以假定已传递自动释放对象。这意味着你无法控制它的寿命。为了确保在使用完它之前不会释放它,可以对对象调用
    retain
    。您现在拥有此对象,并负责在将来某个时间对其调用
    release
    。现在关心对象的保留计数是初学者的错误。别担心。重要的是你有责任在上面调用
    release
  • 使用对象时,请记住通用内存管理范例。例如,如果将此对象添加到
    NSArray
    ,则该数组将保留该对象
  • 一旦完成了需要对对象执行的操作,就可以对其调用
    release
    。再一次。不要关心对象的保留计数,也不要关心其他哪些对象正在使用此对象。重要的是,您已经平衡了对
    retain
    的调用和对
    release
    的调用的数量

检查基本用法

当需要时,我通常只显式使用retain,Xcode调试器会告诉我发生这种情况时发生了什么。通常,无论出于何种原因(开发人员管理不善,或者后台正在进行发布),您对发布的对象执行任何操作都会导致崩溃。只要阅读控制台上的日志,在调试时查看Xcode上的调试器,就可以知道是哪个对象导致了问题。

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

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

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

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

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


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

可能重复[Objective-C中的内存管理]()我认为没有必要对此投反对票。厄普沃特德我很困惑。我只是不明白人们为什么要用它。我试图表达我将如何在刚才的编辑中使用它..您的编辑是错误的:您不应该直接调用dealloc。您也不应该调用两个版本。平衡方法或类中保留和释放的数量。感谢Trinca。似乎