在 UIViewController 之间切换时会发生啥类型的内存问题?

Posted

技术标签:

【中文标题】在 UIViewController 之间切换时会发生啥类型的内存问题?【英文标题】:What type of memory issue is happening when switching between UIViewControllers?在 UIViewController 之间切换时会发生什么类型的内存问题? 【发布时间】:2016-07-14 18:14:11 【问题描述】:

我有一个幻灯片视图控制器,它的内存使用是稳定的,当你点击它时,它会切换到另一个视图控制器。在切换期间,内存使用量会达到峰值,并保持稳定。 (我认为这是正常的)然后在 30 秒内,我让它超时并返回到幻灯片视图控制器,并且内存使用率比原来用于视图控制器的要高。两个开关都使用segues。当您点击视图并使其切换时,内存再次激增。这次它的飙升比上次飙升的要高。这将永远持续下去。这是一张图片:

这个警告也在控制台中不断弹出:

警告:尝试在 谁的视野不在窗内 等级制度!

发生了什么类型的内存问题,什么可能导致内存使用量增加?

编辑:

这是我返回幻灯片视图控制器的方式:

timeOut = [NSTimer scheduledTimerWithTimeInterval:25 target:self selector:@selector(timeOutMethod) userInfo:nil repeats:NO];

-(void) timeOutMethod

    [self performSelector:@selector(loadSlideshowView)
               withObject:nil
               afterDelay:5];



-(void) loadSlideshowView


    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    SlideShowViewController *myVC = (SlideShowViewController *)[storyboard instantiateViewControllerWithIdentifier:@"slideShowImages"];
    [self presentViewController:myVC animated:YES completion:nil];


【问题讨论】:

当你的超时发生时,你如何回到你以前的控制器 - 你能告诉我们那个代码吗?听起来您是在重新呈现视图的新副本,而不是展开到原始视图。 @AliBeadle 我将它添加到我的问题中。 尝试缩短延迟时间,看看会发生什么。幻灯片视图控制器也是这个视图控制器的前一个视图控制器吗?如果是这样,您可以只执行dismissViewController 函数,而不是再次显示视图控制器。 @Konsy 我尝试降低延迟,内存使用没有区别。我也尝试忽略这个观点,遗憾的是这也没有改变任何东西。 @DCAdams 这很奇怪。似乎它正在重新加载 VC 导致使用更高的内存。愚蠢的问题,但您是否尝试通过非编程方式通过 segues 加载视图? 【参考方案1】:

正如instantiateViewControllerWithIdentifier: 的文档所说:

此方法在您每次调用时都会创建指定视图控制器的新实例。

因此,每次超时时,您都在创建视图控制器的新副本,而旧的副本仍保留在后台的内存中。

正如 Konsy 所说,尝试dismissViewController 或unwind segue。

【讨论】:

谢谢!这似乎有效,它第一次上升,但一直保持在那里,并且不再每次都保持尖峰。

以上是关于在 UIViewController 之间切换时会发生啥类型的内存问题?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在两个 UIViewController 之间切换

使用 UINavigationController 在 UIViewController 之间切换

如何使用 Storyboard 在 iOS 中的 UIViewController 之间切换

在 Swift 中单击 NSObject 内部的 tableView 中的项目时,如何在 NSObject 类中的 UIViewController 上的 UIView 之间正确切换?

在不使用故事板中的导航控制器的情况下在 UIViewController 之间切换的最佳方法是啥?

layoutAnimation 在两个视图之间切换时会在 Android 上导致额外的蓝色背景