[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]] 在解除分配数组时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
所选值未存储在 didSelectRow 的 AddObject 中
Spring MVC - HttpSession.setAttribute 和 model.addObject 之间的区别