iOS 7取消交互式转场未释放呈现的视图控制器。

8
当交互式转换被取消时,呈现的视图控制器永远不会被释放(dealloc从未被调用)。 当交互式转换成功完成时,一切正常,但是当这个转换被取消时,似乎目标视图控制器永远不会被释放。结果是内存损失,但不是内存泄漏(至少不是由Instruments检测到的)。我可能做错了什么,但我不知道是什么。由于我无法找到任何其他人遇到这个问题的证据,所以我认为这是我的问题。
我有一个非常小的示例项目,演示了这个问题(https://github.com/mparma-isi/InteractiveTransitionIssue.git)。在红色正方形中点击执行到第二个视图控制器的过渡。在第二个控制器中点击将该控制器解除回到第一个。在第一个视图控制器的红色正方形内部进行握手手势可以使用UIPercentDrivenInteractiveTransition开始交互式转换。如果您取消转换(捏合的负速度),则呈现的视图控制器不会被释放。如果您完成转换,则所有内容都按预期工作。
提前感谢您的任何帮助。
麦克

我猜我有点晚回复,但我也遇到了这个问题。实际上,在我能找到的所有示例中都存在这个问题,所以我想可以安全地假设这是一个UIKit的bug。你想到了解决方法吗? - secondcitysaint
仍然正确,有任何更改吗? - Avi Cohen
1个回答

0

所以我使用泄漏检测工具对其进行了分析,并发现了一些有趣的东西:

Leaks instrument trace

看起来内存泄漏是来自于这一行代码。没有任何配对的-[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
        }
    }
}

我将为此提交一个雷达反馈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接