什么时候应该使用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
就是您可以调用的方式。
这是它应该工作的方式:
- 您调用一个返回对象的方法。如果你还没有通过调用
alloc
、new
、copy
或mutableCopy
收到这个对象,那么根据Memory Management Guide您不拥有该对象,因此您不负责管理该内存。 - 在大多数情况下,您可以假设您已传递了一个自动释放的对象。这意味着您无法控制它的生命周期。为了确保在使用完成之前它不会被释放,您可以在该对象上调用
retain
。您现在拥有该对象,并负责在将来的某个时间对其调用release
。现在关心对象的保留计数是初学者的错误。别这样。重要的是您有责任对其调用release
。 - 您在使用对象时要牢记一般的内存管理范例。例如,如果您将此对象添加到
NSArray
中,那么它将被该数组保留。 - 一旦完成了需要对对象执行的操作,就可以对其调用
release
。再次。不要关心对象的保留计数,或者其他对象正在使用该对象。重要的是您平衡了对retain
的调用与对release
的相同数量的调用。
关于iphone - 了解何时对对象调用保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4450644/