iOS 7取消交互式转换无法释放呈现的视图控制器

前端之家收集整理的这篇文章主要介绍了iOS 7取消交互式转换无法释放呈现的视图控制器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
取消交互式转换时,永远不会释放呈现的视图控制器(从不调用dealloc).当交互式转换成功完成时,一切都很好,但是当取消此转换时,似乎永远不会释放目标视图控制器.结果是内存丢失,但没有内存泄漏(至少没有被Instruments检测到).我可能做错了什么,但我不知道那是什么.由于我无法找到任何其他人遇到此问题的证据,我认为是我.

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

在此先感谢您的帮助.

麦克风

解决方法

所以我用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
        }
    }
}

我要为此提交雷达.

猜你在找的iOS相关文章