ios - 关于内存警告的问题
<p><p>我的 iOS 应用存在内存问题,对此我有几个问题。</p>
<p>首先,我正在使用 iOS 6 并且正在使用 ARC。</p>
<p>现在让我解释一下我的情况:</p>
<p>我有 2 个 View 。从第一个 View 中,如果我点击一个按钮,我会创建第二个 View (使用 <code>alloc</code> 和 <code>init</code>)并使用以下代码将其显示为模式:</p>
<pre><code>[self presentViewController:secondView animated:YES completion:^{
; // Function I use to start my computations and rendering
}];
</code></pre>
<p>有时,当计算完成后,我想关闭我的第二个 View 并返回到第一个 View 。我从第二个角度使用此代码:</p>
<pre><code>[self dismissViewControllerAnimated:YES completion:^{
;// Function I use to free some malloc
}];
</code></pre>
<p>我使用 Instruments Allocations and Leaks 运行我的应用程序,但我没有任何泄漏。</p>
<p>这是我的 <code>didReceiveMemoryWarning</code> 的代码:</p>
<pre><code>- (void)didReceiveMemoryWarning
{
;
if ( && ([ window] == nil)) {
self.view = nil;
;
if ( == self.context) {
;
}
self.context = nil;
}
// Dispose of any resources that can be recreated.
NSLog(@"Resources freed");
}
</code></pre>
<p><code>tearDownGL</code> 函数释放 OpenGLES 资源,如纹理、顶点数组……</p>
<p>当我运行我的应用程序时,在第一个 View 和第二个 View 之间多次切换后,我收到内存警告,然后我的应用程序崩溃了。</p>
<p><strong>这是我的问题:</strong></p>
<p><strong>1-</strong> 应用程序是否会自动释放我的 UIImage、UIView 等 Controller ?如果没有,我如何在使用 ARC 时释放它们?
我还看到了 <code>viewDidUnload</code> 函数,但正如文档所说,它已被弃用:</p>
<blockquote>
<p>Called when the controller’s view is released from memory. (Deprecated
in iOS 6.0. Views are no longer purged under low-memory conditions and
so this method is never called.)</p>
</blockquote>
<p>但是,如果在内存不足的情况下不再清除 View ,我该如何释放更多内存以防止我的应用程序崩溃?
我该怎么办?</p>
<p><strong>2-</strong> 我在我的 2 个 Controller 的 <code>didReceiveMemoryWarning</code> 函数上设置了一个断点。当我在模拟器上运行应用程序时,我会模拟内存警告。
我可以看到 <code>didReceiveMemoryWarning</code> 为我的 2 个 Controller 调用了一次。
但是,如果我在我的第一个和第二个 Controller 之间切换多次,则 <code>didReceiveMemoryWarning</code> 会为我的第一个 ViewController 调用一次,但为我的第二个 ViewController 调用多次。如果我切换 3 次,该函数将被调用 3 次。所以我想,当我“关闭”我的第二个 View 以返回第一个 View 时,第二个 View 没有被释放并且仍然存在。为什么 ?我怎样才能强制它被摧毁? (因为我不再使用它并创建一个新的)
我在一个函数中创建了第二个 ViewController ,我没有保留对它的任何引用(它没有存储在类中)。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>您应该释放(在 ARC 中,这意味着将所有强引用设置为 nil)所有当前不需要并且可以(容易)重新使用的内存(图像、NSData 对象、数组、模型层表示的所有数据等) - 再次使用时创建。如果这些对象在内存警告期间可能已被释放,然后将被重新创建,则所有其他代码都应以检查属性/iVar 是否为零的方式编写。 </p>
<p>我怀疑 <code>self.view</code> 是否属于可能被处置的对象之一。 </p>
<p>您可能已经显示了一个 UIImageView。那很可能是用 UIImage 对象创建的。显示 UIImageView 时,您实际上并不需要内存中的 UIImage。 (如果 UIImageView 仍然需要它,那么它会保留它或在其 onw 上保留一个强引用,这样您就不必担心保留图像本身。)这就是要释放的资源。 </p>
<p>如果 <code>self.context</code> 在处置资源中,我不能说。很可能是这样。 </p></p>
<p style="font-size: 20px;">关于ios - 关于内存警告的问题,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/18631321/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/18631321/
</a>
</p>
页:
[1]