2

我在 UIView 动画块上遇到了一些奇怪的事情。

运行动画代码后,视图从未释放。在调用动画代码之前,我将视图属性设置为 nil。然后在完成块内,我将它从超级视图中删除,所以在淡出之后它就消失了。

但是从不调用该淡出和删除视图的 -dealloc 。然后我想也许完成块保留了视图并使用__weakwhich 做了一个弱引用。动画完成后视图突然被正确释放。

但是在动画块本身中,我只是引用了视图并将其 alpha 设置为 0。没有__weak引用,视图仍然可以正确释放。

结论: iOS 会在动画完成后清理动画块。但它不会清理完成块。意味着:您必须对完成块中的所有内容使用 __weak 引用,因为它会永远存在。

是否有一种神奇的方法可以触发完成块处理或清理,以便释放所有强引用?当然,我使用 ARC 顺便说一句。

4

1 回答 1

1

听起来您通过在块中使用强引用无意中创建了一个保留周期。视图对块有一个强引用,而块对视图有一个强引用,并且相互的强引用阻止了任何一个被释放。将块的引用转换为弱引用打破了循环,允许释放视图(最终是块)。

您会在这个 SO 问题中找到关于在块中创建保留循环的可能性的很好的讨论:ARC, ivars in Blocks and Reference Cycles via Captured Self

于 2013-05-25T16:21:59.757 回答