首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 7取消交互式过渡无法释放显示的视图控制器

iOS 7取消交互式过渡无法释放显示的视图控制器
EN

Stack Overflow用户
提问于 2013-12-09 00:03:51
回答 1查看 462关注 0票数 8

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

我有一个非常小的示例项目来演示这个问题(https://github.com/mparma-isi/InteractiveTransitionIssue.git)。在红色方块中轻触将执行到第二个视图控制器的转换。在第二个控制器中轻敲一下,该控制器将返回到第一个控制器。在第一个视图控制器的红色方块内的收缩手势开始使用UIPercentDrivenInteractiveTransition进行交互式转换。如果取消过渡(收缩的负速度),则不会释放所显示的视图控制器。如果您完成了转换,则所有操作都将按预期进行。

提前感谢您的帮助。

麦克

EN

回答 1

Stack Overflow用户

发布于 2014-04-10 05:31:25

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

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

虽然很难看,但这个变通方法对我来说很有用:

代码语言:javascript
复制
- (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
        }
    }
}

我要为这件事向雷达报告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20455479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档