我写了一个类,用于声明性地描述一系列UIView动画。我的方法采用了一系列动画块并将它们放在一个数组中。所以在我的循环中我想这样做:
[animations addObject:[[block copy] autorelease]];
我首先copy
阻止它移动到堆中,允许它被数组retain
编辑。然后我自动释放它以放弃所有权(因为数组保留它)。
然而,当动画阵列被释放时,这会崩溃。 (我的理解是引用的块已经被释放了。)
奇怪的是,这个有效:
[animations addObject:[block copy]];
[block release];
更新 - ......就像这样:
[animations addObject:[block copy]];
[block autorelease];
为什么?我原本希望所有3个代码段能够同样正常运行。有什么解释吗?
答案 0 :(得分:6)
示例1:
[animations addObject:[[block copy] autorelease]];
这是复制一个块,并自动释放副本。
示例2:
[animations addObject:[block copy]];
[block release];
这是复制一个块,然后释放原始。如果您已经很好地处理了内存,这会导致您的原始块被过度释放(并且崩溃),并且您的副本被泄露。
示例3:
[animations addObject:[block copy]];
[block autorelease];
这是复制一个块,然后自动释放原始。请参阅前面示例中的注释。
那么,你的答案就是你的代码在其他地方做错了。解决这个问题,然后回到第一个例子。