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

Mar*_*ere 6 iphone cocoa-touch memory-management

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

编辑:

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

用它来说,这是一个retain用法的例子

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

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

我很困惑.

Abi*_*ern 6

所有答案都可以在" 内存管理指南"中找到.

编辑

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

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

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

你使用那个对象

永远不要确定它会存在.

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

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

它看起来好像你想打电话,release因为你认为这就是你管理记忆的方式,那retain就是让你称之为内存的东西.

这是它应该工作的方式:

  • 您调用返回对象的方法.如果您没有通过调用alloc,或者根据" 内存管理指南"获得此对象new,则您不拥有该对象,因此您不负责管理此内存.copymutableCopy
  • 在大多数情况下,您可以假设您已经传递了一个自动释放的对象.这意味着你无法控制它的生命周期.为了确保在完成它之前它不会被释放,你可以调用retain该对象.您现在拥有此对象,并负责release在将来的某个时间调用它.现在关注对象的保留计数是一个初学者的错误.不要.重要的是你有责任呼吁release它.
  • 您使用该对象时要记住一般的内存管理范例.例如,如果将此对象添加到a,NSArray则它将由数组保留.
  • 一旦完成了对象所需的操作,就可以调用release它.再次.不要关心对象的保留计数,或者其他对象正在使用此对象.重要的是,您retain通过相同数量的呼叫来平衡您的呼叫release.