我有点理解保留的重要性。但并非如此。我看了很多谷歌试图理解,但我仍然没有。
现在我有一些代码(我正在进行iPhone开发),我认为我应该使用它们但不完全知道如何。
有人能给我一个如何以及为何使用它们的快速而好的例子吗?
谢谢!
答案 0 :(得分:20)
我听过的最好的解释是来自Aaron Hillegass:
将对象想象成一只狗。你需要一条狗的皮带,以防止它逃跑并消失,对吗?
现在,将retain
视为牵引带。每次拨打retain
时,都会在狗的项圈上添加皮带。你说,“我希望这条狗能够坚持下去。”你对皮带的保持确保了狗会一直待在你身上。
想一下release
从狗的衣领上取下一条皮带。当所有的皮带被移除后,狗可以逃跑。不能保证狗会再呆在身边。
现在,请你打电话给retain
并在狗身上系上皮带。我也需要这条狗,所以我和你一起走,开始训练他。完成狗之后,请拨打release
并移除您的皮带。没有更多的牵引带,狗跑开了,尽管我还在训练他!
相反,如果我在开始训练之前给狗打电话retain
,我会在衣领上再戴第二条皮带。当你打电话给release
然后移走你的皮带时,我仍然有一条,而且狗还不能消失。
不同的物品可以通过调用retain
并在其衣领上放另一条皮带来“拥有”狗。每个物体都确保狗在完成之前不会消失。在所有的皮带都被移除之前,狗不能消失。
自动释放池变得更加复杂,但是简单地说,您可以考虑将autorelease
称为将皮带交给培训师。你不再需要这只狗了,但是你没有立即移除你的皮带。训练师稍后会脱掉皮带;当你需要它时,仍无法保证狗会在身边。
答案 1 :(得分:5)
如果您还没有我强烈建议您熟悉Memory Management Programing Guide from Apple
在那里你会找到一个专门针对retain counts
的部分