[myArray addObject:[[objcBlock copy] autorelease]]在dealloc'ing数组时崩溃

时间:2011-05-02 08:24:12

标签: objective-c autorelease objective-c-blocks

我写了一个类,用于声明性地描述一系列UIView动画。我的方法采用了一系列动画块并将它们放在一个数组中。所以在我的循环中我想这样做:

[animations addObject:[[block copy] autorelease]];

我首先copy阻止它移动到堆中,允许它被数组retain编辑。然后我自动释放它以放弃所有权(因为数组保留它)。

然而,当动画阵列被释放时,这会崩溃。 (我的理解是引用的块已经被释放了。)

奇怪的是,这个有效:

[animations addObject:[block copy]];
[block release];

更新 - ......就像这样:

[animations addObject:[block copy]];
[block autorelease];

为什么?我原本希望所有3个代码段能够同样正常运行。有什么解释吗?

1 个答案:

答案 0 :(得分:6)

示例1:

[animations addObject:[[block copy] autorelease]];

这是复制一个块,并自动释放副本。

示例2:

[animations addObject:[block copy]];
[block release];

这是复制一个块,然后释放原始。如果您已经很好地处理了内存,这会导致您的原始块被过度释放(并且崩溃),并且您的副本被泄露。

示例3:

[animations addObject:[block copy]];
[block autorelease];

这是复制一个块,然后自动释放原始。请参阅前面示例中的注释。

那么,你的答案就是你的代码在其他地方做错了。解决这个问题,然后回到第一个例子。