Objective-C保留计数澄清

时间:2010-05-21 12:11:55

标签: objective-c cocoa retain

我有点理解保留的重要性。但并非如此。我看了很多谷歌试图理解,但我仍然没有。

现在我有一些代码(我正在进行iPhone开发),我认为我应该使用它们但不完全知道如何。

有人能给我一个如何以及为何使用它们的快速而好的例子吗?

谢谢!

2 个答案:

答案 0 :(得分:20)

我听过的最好的解释是来自Aaron Hillegass:

将对象想象成一只狗。你需要一条狗的皮带,以防止它逃跑并消失,对吗?

现在,将retain视为牵引带。每次拨打retain时,都会在狗的项圈上添加皮带。你说,“我希望这条狗能够坚持下去。”你对皮带的保持确保了狗会一直待在你身上。

想一下release从狗的衣领上取下一条皮带。当所有的皮带被移除后,狗可以逃跑。不能保证狗会再呆在身边。

现在,请你打电话给retain并在狗身上系上皮带。我也需要这条狗,所以我和你一起走,开始训练他。完成狗之后,请拨打release并移除您的皮带。没有更多的牵引带,狗跑开了,尽管我还在训练他!

相反,如果我在开始训练之前给狗打电话retain,我会在衣领上再戴第二条皮带。当你打电话给release然后移走你的皮带时,我仍然有一条,而且狗还不能消失。

不同的物品可以通过调用retain并在其衣领上放另一条皮带来“拥有”狗。每个物体都确保狗在完成之前不会消失。在所有的皮带都被移除之前,狗不能消失。

自动释放池变得更加复杂,但是简单地说,您可以考虑将autorelease称为将皮带交给培训师。你不再需要这只狗了,但是你没有立即移除你的皮带。训练师稍后会脱掉皮带;当你需要它时,仍无法保证狗会在身边。

答案 1 :(得分:5)

如果您还没有我强烈建议您熟悉Memory Management Programing Guide from Apple

在那里你会找到一个专门针对retain counts

的部分