[myArray addObject:[[objcBlock copy] autorelease]] 在解除分配数组时崩溃

Posted

技术标签:

【中文标题】[myArray addObject:[[objcBlock copy] autorelease]] 在解除分配数组时崩溃【英文标题】:[myArray addObject:[[objcBlock copy] autorelease]] crashes on dealloc'ing the array 【发布时间】:2011-05-02 08:24:11 【问题描述】:

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

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

我首先将块 copy 移动到堆中,使其被数组retain'ed。然后我自动释放它以放弃所有权(因为数组保留了它)。

但是,当动画数组被解除分配时,这会崩溃。 (我的理解是引用的块已经被dealloc了。)

奇怪的是,这个有效:

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

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

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

为什么?我本来希望所有 3 个代码 sn-ps 都能正常工作。有什么解释吗?

【问题讨论】:

我相信您的代码中还有其他原因会导致崩溃。您发布的内容是正确的,应该可以使用。您能否创建一个重现此问题的最小测试用例? 感谢您的提示。我还在调查,目前正在尝试构建一个最小的测试用例。 巴伐利亚是对的。问题是,在之前修复内存泄漏的尝试中,我在释放包含它们的数组之前手动释放了这些块。不过奇怪的是,对于底部的两个代码 sn-ps,过度释放块并没有崩溃! 【参考方案1】:

示例 1:

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

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

示例 2:

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

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

示例 3:

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

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

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

【讨论】:

很好地发现了@steven-fisher

以上是关于[myArray addObject:[[objcBlock copy] autorelease]] 在解除分配数组时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 4 - AddObject 与 Attach

所选值未存储在 didSelectRow 的 AddObject 中

WCF 数据服务 AddObject

Spring MVC - HttpSession.setAttribute 和 model.addObject 之间的区别

NSMutableArray addObject,无法识别的选择器

CoreData NSArrayController addObject:非常慢