gpt4 book ai didi

iphone - iOS不清理UIView动画的完成 block 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:42:57 24 4
gpt4 key购买 nike

我在使用 UIView 动画 block 时遇到了一些奇怪的事情。

在我运行我的动画代码后,一个 View 从未被释放。在调用动画代码之前,我将 view 属性设置为 nil。然后在完成 block 内,我将它从 superview 中删除,所以在淡出后它就消失了。

但是那个淡出和移除 View 的 -dealloc 永远不会被调用。然后我想也许完成 block 保留了 View 并使用有效的 __weak 进行了弱引用。动画完成后突然正确释放 View 。

但在动画 block 本身中,我只是简单地引用 View 并将其 alpha 设置为 0。没有 __weak 引用, View 仍会正确解除分配。

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

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

最佳答案

听起来您在 block 中使用强引用无意中创建了一个循环保留。 View 对 block 有强引用, block 对 View 有强引用,相互的强引用阻止了任何一个被释放。将 block 的引用转换为 weak 打破了循环,从而允许释放 View (以及最终的 block )。

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

关于iphone - iOS不清理UIView动画的完成 block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16751365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com