我对UIView动画块感到奇怪。
运行动画代码后,视图永远不会被释放。在调用动画代码之前,我将view属性设置为nil。然后在完成块中我将它从superview中移除,因此在淡出后它就消失了。
但是-dealloc的淡出和删除视图永远不会被调用。然后我想也许完成块保留了视图并使用有效的__weak
做了一个弱引用。动画完成后,视图突然解除了分配。
但是在动画块中我只是引用视图并将其alpha设置为0.没有__weak
引用,并且视图仍然可以正确释放。
结论: iOS动画完成后会清理动画块。但它不会清理完成块。意思是:你必须对完成块中的所有内容使用__weak引用,因为它永远存在。
是否有一种神奇的方法来触发完成块处理或清理,以便释放所有强引用?当然我用ARC btw。
答案 0 :(得分:1)
听起来你通过在块中使用强引用无意中创建了一个保留周期。该视图强烈引用了该块,并且该块具有对该视图的强烈引用,并且相互强引用阻止任何一个被取消分配。将块的引用转换为弱会破坏循环,允许视图(最终是块)被释放。
在这个SO问题中,你会发现很好地讨论了在块中创建保留周期的可能性:ARC, ivars in Blocks and Reference Cycles via Captured Self。