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

Yan*_*yer 4 objective-c autorelease objective-c-blocks

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

[animations addObject:[[block copy] autorelease]];
Run Code Online (Sandbox Code Playgroud)

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

但是,当动画数组被释放时,这会崩溃.(我的理解是引用的块已经被释放了.)

奇怪的是,有效:

[animations addObject:[block copy]];
[block release];
Run Code Online (Sandbox Code Playgroud)

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

[animations addObject:[block copy]];
[block autorelease];
Run Code Online (Sandbox Code Playgroud)

为什么?我原本期望所有3个代码片段同样有效.任何解释?

Ste*_*her 6

例1:

[animations addObject:[[block copy] autorelease]];
Run Code Online (Sandbox Code Playgroud)

这是复制块,并自动释放副本.

例2:

[animations addObject:[block copy]];
[block release];
Run Code Online (Sandbox Code Playgroud)

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

例3:

[animations addObject:[block copy]];
[block autorelease];
Run Code Online (Sandbox Code Playgroud)

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

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