Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 保持内存清洁并关闭ViewController_Ios_Swift_Xcode_Memory Management_Viewcontroller - Fatal编程技术网

Ios 保持内存清洁并关闭ViewController

Ios 保持内存清洁并关闭ViewController,ios,swift,xcode,memory-management,viewcontroller,Ios,Swift,Xcode,Memory Management,Viewcontroller,我注意到,当我在iOS应用程序中导航时,内存堆栈会随着每个打开的viewController而增长 我的导航是基于segue的,在执行每个segue之前我都会自行关闭。不过,它看起来像是内存中的ViewController堆栈 我怎样才能避免这种情况 在Android中,finish在大多数情况下会终止活动,因此我需要在iOs中使用另一个选项。在UIViewController.dismission上: 取消由视图控制器以模式显示的视图控制器 因此,调用此函数将忽略以模态方式显示的任何视图控制器

我注意到,当我在iOS应用程序中导航时,内存堆栈会随着每个打开的viewController而增长

我的导航是基于segue的,在执行每个segue之前我都会自行关闭。不过,它看起来像是内存中的ViewController堆栈

我怎样才能避免这种情况

在Android中,finish在大多数情况下会终止活动,因此我需要在iOs中使用另一个选项。

在UIViewController.dismission上:

取消由视图控制器以模式显示的视图控制器

因此,调用此函数将忽略以模态方式显示的任何视图控制器。基于您的问题,我必须假设您的segue是push segue而不是modal,否则您将看到视图控制器消失

您的“视图控制器堆栈”可能与UINavigationController上的导航堆栈有关。如果是这样,那么这些视图控制器将保留在内存中,就像当视图控制器从堆栈中弹出一样:用户从屏幕左边缘滑动,或在导航栏中回击时,会显示上一个视图控制器

如果没有关于如何显示视图控制器或构建导航的更多信息,我认为您将无法获得更多答案。

关于UIViewController.Dismission:

取消由视图控制器以模式显示的视图控制器

因此,调用此函数将忽略以模态方式显示的任何视图控制器。基于您的问题,我必须假设您的segue是push segue而不是modal,否则您将看到视图控制器消失

您的“视图控制器堆栈”可能与UINavigationController上的导航堆栈有关。如果是这样,那么这些视图控制器将保留在内存中,就像当视图控制器从堆栈中弹出一样:用户从屏幕左边缘滑动,或在导航栏中回击时,会显示上一个视图控制器


如果没有关于如何显示视图控制器或构建导航的更多信息,我认为您将无法获得更多答案。

内存问题可能有多种原因,而不一定是UIViewController。为了发现并解决问题,您必须将问题的范围从应用程序缩小到某个屏幕甚至类。然后你可以检查代码,试图找出可疑代码在哪里

解决这个问题不是一个简单的任务,我的应用程序教程中也没有解决内存问题的方法,您必须检查代码,并与内存泄漏的潜在原因进行比较

此外,您还必须小心内存泄漏的误报。当我怀疑内存问题时,以下是我遵循的一些步骤

浏览应用程序直到结束,然后返回主屏幕,如果内存下降,一切正常

如果内存没有下降,我会多次执行相同的导航,如果内存随着相同的步骤或多或少地增加,但接近,那么就有问题了。如果内存没有增加,可能只是一点点,几kb,那么就没问题了,这意味着内存图像、文件等中缓存了一些资产。但是您也需要一种方法来测试这个场景

现在我们又回到了内存增加的状态,几乎和第一次一样,现在我做了一次干净的运行,一次查看每个屏幕,我只需打开屏幕返回,关闭/弹出控制器并观察,如果内存下降,则不是屏幕泄漏。当我发现屏幕增加了内存并且不再返回时:

检查控制器是否作为对其他对象的引用传递,这些对象不会被释放为单例类或其他对象,具体取决于应用程序。 检查控制器是否作为委托发送到任何其他类,以及这些委托是否定义正确。强委托是BIIIG问题。 如果以上所有操作都正常,那么我只需对执行任何工作的所有代码进行注释,然后重试。如果注释代码没有删除内存,这种情况很少发生,那么屏幕不是正确的。 如果在注释代码后内存下降,我将开始对代码中的一些位进行反注释,然后再次运行,直到找到导致问题的代码。
要记住的一点是,在调查内存问题时,你必须耐心,老实说,有时你也必须幸运。

内存问题可能有多种原因,而不一定是UIViewController造成的。为了发现并解决问题,您必须将问题的范围从应用程序缩小到某个屏幕甚至类。然后你可以检查代码,试图找出可疑代码在哪里

解决这个问题不是一个简单的任务,我的应用程序教程中也没有解决内存问题的方法,您必须检查代码,并与内存泄漏的潜在原因进行比较

此外,您还必须小心内存泄漏的误报。当我怀疑内存问题时,以下是我遵循的一些步骤

在应用程序中导航到最后,然后返回主屏幕,如果记忆 y滴,都很好

如果内存没有下降,我会多次执行相同的导航,如果内存随着相同的步骤或多或少地增加,但接近,那么就有问题了。如果内存没有增加,可能只是一点点,几kb,那么就没问题了,这意味着内存图像、文件等中缓存了一些资产。但是您也需要一种方法来测试这个场景

现在我们又回到了内存增加的状态,几乎和第一次一样,现在我做了一次干净的运行,一次查看每个屏幕,我只需打开屏幕返回,关闭/弹出控制器并观察,如果内存下降,则不是屏幕泄漏。当我发现屏幕增加了内存并且不再返回时:

检查控制器是否作为对其他对象的引用传递,这些对象不会被释放为单例类或其他对象,具体取决于应用程序。 检查控制器是否作为委托发送到任何其他类,以及这些委托是否定义正确。强委托是BIIIG问题。 如果以上所有操作都正常,那么我只需对执行任何工作的所有代码进行注释,然后重试。如果注释代码没有删除内存,这种情况很少发生,那么屏幕不是正确的。 如果在注释代码后内存下降,我将开始对代码中的一些位进行反注释,然后再次运行,直到找到导致问题的代码。
有一件事要记住,在调查内存问题时,你必须耐心,老实说,有时候你也必须幸运。

那可能是内存泄漏问题。您能否澄清如何显示视图控制器等?请尝试自我。在视图中从父视图控制器移除将消失您可以导航控制器?PoptorOotViewController初始化:错误。那么可能是内存泄漏问题。您能否澄清如何显示视图控制器等?请尝试在视图中显示self.removeFromParentViewController将消失您可以导航控制器吗?.PoptorootViewController激活:False我在我的视图控制器中的元素单击事件上执行简单的显示分段。所有片段都在具有Show属性的情节提要中定义。视图控制器确实消失了,但仍留在内存中,这正是我担心的。我在视图控制器中对元素单击事件执行简单的显示序列。所有片段都在具有Show属性的情节提要中定义。视图控制器确实消失了,但仍留在内存中,这正是我所担心的。很棒的方法!我将遵循这些步骤,谢谢。这是我读过的关于内存泄漏问题的最好答案之一。干得好,兄弟!很有效,很好的方法!我将遵循这些步骤,谢谢。这是我读过的关于内存泄漏问题的最好答案之一。干得好,兄弟!它起作用了。