【问题标题】:iOS 7 cancellation of interactive transition fails to release presented view controlleriOS 7取消交互过渡无法释放呈现的视图控制器
【发布时间】:2013-12-25 16:02:31
【问题描述】:

当取消交互转换时,呈现的视图控制器永远不会释放(永远不会调用 dealloc)。当一个交互转换成功完成时,一切都很好,但是当这个转换被取消时,目标视图控制器似乎永远不会被释放。结果是内存丢失,但不是内存泄漏(至少 Instruments 没有检测到)。我可能做错了什么,但我不明白那是什么。由于我无法找到任何证据表明其他人有此问题,我认为是我。

我有一个非常小的示例项目来演示该问题 (https://github.com/mparma-isi/InteractiveTransitionIssue.git)。红色方块中的点击执行到第二个视图控制器的转换。在第二个控制器中轻按一下即可将该控制器解散回第一个控制器。第一个视图控制器的红色方块内的捏合手势使用 UIPercentDrivenInteractiveTransition 启动交互式过渡。如果您取消转换(捏合的负速度),则呈现的视图控制器不会被释放。如果您完成了过渡,一切都会按预期进行。

提前感谢您的帮助。

迈克

【问题讨论】:

  • 我想我回复有点晚了,但我也面临这个问题。事实上,它存在于我能找到的所有示例中,所以我想可以安全地假设这是一个 UIKit 错误。你有没有想出一个解决方法,也许?
  • 仍然正确,有什么变化吗?

标签: ios uiviewcontroller


【解决方案1】:

所以我用 Leaks 仪器对此进行了分析,发现了一些有趣的东西:

似乎内存泄漏来自突出显示的行。任何地方都没有成对的 -[UIWindow _remoteRotationViewController:] 调用(不管它是什么),所以窗口让我们呈现的视图控制器保持活动状态。

虽然很丑陋,但这个解决方法对我有用:

- (void)animationEnded:(BOOL)transitionCompleted {
    if (!transitionCompleted) {
        UIViewController *viewController = ...; // get the presented view controller

        UIWindow *window = [UIApplication sharedApplication].keyWindow;
        SEL selector = NSSelectorFromString(@"_removeRotationViewController:");
        if ([window respondsToSelector:selector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
            [window performSelector:selector withObject:viewController];
#pragma clang diagnostic pop
        }
    }
}

我要为此提交雷达。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多