在 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 之间正确切换?