菜鸟教程小白 发表于 2022-12-11 22:06:39

ios - NavigationController 中的循环 - 如何避免内存泄漏?


                                            <p><p>在我的应用程序中,我有一个带有四个 Controller 的导航 Controller 。用户从 <code>A -> B -> C -> D -> A_1 -> B_2 -></code> ...等导航。这是一种方式,每个 <code>ViewController</code> 始终是新的 <code>ViewController</code>。 </p>

<p>这个循环是有意的。但是在 <code>ViewController A</code> 和 <code>C</code> 我初始化了使用大量内存的 <code>GoogleMaps</code>。因此,在 15 次循环(以及 30 次 GoogleMaps 初始化)之后,我的应用程序由于内存泄漏而崩溃。 </p>

<p>现在我看到了解决这个问题的不同可能性。 </p>

<p>1) 我没有初始化新的 ViewController,而是重用了我的 VC。所以谷歌地图只是初始化了两次。
<em>我不喜欢这样,因为我的 VC 可能有不同的状态。一个干净的初始化会更舒服,错误源也更小</em></p>

<p>2) 我在正确的时间移除堆栈,因为导航只是一种方式。当 <code>A -> B</code> 的转换完成后,我可以将 A 扔掉。 <code>C -> D</code>也是一样的。</p>

<p>3) 我在转换后取消初始化 Googlemap 。我还不知道该怎么做,但我很确定我会弄明白的。</p>

<p>我读到了 <a href="https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621861-setviewcontrollers" rel="noreferrer noopener nofollow">setViewControllers</a>我可以用它来替换 ViewController 。</p>

<p>最佳做法是什么?苹果有什么推荐? </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><strong>从第 3 个也是最简单的选项开始:</strong></p>

<p>使用 <code>override func viewWillDisappear(){}</code> 来取消初始化谷歌地图。您也可以将此方法用于第二个选项。 </p>

<p>但我认为,当您从 D 回到 A 时,您应该使用委托(delegate)。当您再次到达 A 时,您对 A 有何更改?</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NavigationController 中的循环 - 如何避免内存泄漏?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/54536803/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/54536803/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NavigationController 中的循环 - 如何避免内存泄漏?