iphone - 了解何时对对象调用保留?

标签 iphone cocoa-touch memory-management

什么时候应该使用retain?据我所知,它会增加对象引用计数,因此基本上该对象的下一个 release 不会对其调用 dealloc 。好吧,太好了,那又怎样?我读到过,这是某种约定,如果你关心一个对象,你就保留它。有这样的例子吗?这是真的吗?

编辑:

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

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

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

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

拜托,我很困惑。

最佳答案

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

编辑

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

in your code, you somewhere invoke a method a method that returns an object that you don't own

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

you work with that object

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

then you want to release it => you can't because you're not the owner

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

看起来您想要调用 release,因为您认为这就是管理内存的方式,而 retain 就是您可以调用的方式。

这是它应该工作的方式:

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

关于iphone - 了解何时对对象调用保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4450644/

相关文章:

iphone - View Controller 初始化?

iphone - setVolume 无法在 AVMutableAudioMixInputParameters 上使用本地 iPod 库播放

iphone - 更改 Facebook "Post to wall"页面 iOS 中的图像

ios - 如何使用 NSUserDefaults 存储容器类

javascript - 在 Node.js 中,是否监听 EventEmitter,创建对它的引用?

objective-c - 调用者此时不拥有的对象的引用计数的不正确减少

ios - 如何为 Uitextfield 设置最小和最大限制?

iphone - 管理多个 UIActivityIndi​​catorView

iphone - 有没有一种方便的方法可以从一个方法中获得两个不同的 "nil-like"可能的返回值?

ios - SDWebImage - UITableView 中的内存泄漏?