gpt4 book ai didi

iOS 7 取消交互过渡无法释放呈现的 View Controller

转载 作者:可可西里 更新时间:2023-11-01 03:21:19 25 4
gpt4 key购买 nike

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

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

在此先感谢您的帮助。

迈克

最佳答案

所以我用 Leaks instrument 分析了这个并发现了一些有趣的东西:

Leaks instrument trace

似乎内存泄漏来自突出显示的行。没有成对的 -[UIWindow _remoteRotationViewController:] 调用任何地方(无论它是什么),因此窗口使我们呈现的 View Controller 保持事件状态。

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

- (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
}
}
}

我要为此提交 Radar。

关于iOS 7 取消交互过渡无法释放呈现的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com