菜鸟教程小白 发表于 2022-12-13 07:58:15

ios - ImageIO_PNG_DATA 在应用程序从后台移动到前台后继续增长


                                            <p><p>我有一个应用程序,我在其中使用了大量图像,但我发现应用程序内存占用存在异常问题。我正在使用 <code>imageNamed</code> 方法来初始化 <code>UIImage</code> 对象。从我读到的文档中, <code>imageNamed</code> 将内存保存在缓存中,并且不会每次都重新加载图像。这对我有用,因为我的应用程序仅基于图像,但在我的情况下,似乎每次我的应用程序从 <code>background</code> 移动到 <code>foreground</code> 时,图像都会再次加载。我觉得这是因为当我在每一代中为应用程序进行内存分析时,每当我从后台移动到前台时,在 <code>VM:ImageIO_PNG_DATA</code> 中消耗的内存量大大增加,最终我的应用程序崩溃了,因为它消耗更多超过 600 MB。在某些地方我读到我们应该使用 <code>imageWithContentsOfFile</code> 来避免这个问题,但我不确定这是否是正确的方法。</p>

<p>请指导我。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><a href="https://developer.apple.com/library/ios/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006890-CH3-SW10" rel="noreferrer noopener nofollow">docs</a>说:“如果您有一个只显示一次的图像文件并希望确保它不会被添加到系统的缓存中,您应该使用 <code>imageWithContentsOfFile:</code> 创建您的图像。这将保持将您的单次使用图像从系统图像缓存中提取出来,这可能会改善您应用的内存使用特性。”<br/>
所以,如果你的图片没有被重复使用,你应该使用 <code>imageWithContentsOfFile:</code> 而不是 <code>imageNamed:</code>。 </p>

<p>另外一点是这两种方法都创建了自动释放对象。即使这些对象不再使用,它​​们也只有在自动释放池耗尽时才会从内存中删除。如果您没有设置自己的自动释放池,它可能很少会被耗尽。如果您使用类似 </p> 的 block 设置自己的自动释放池,您可能会使用更少的内存

<pre><code>@autoreleasepool {
    // Your code here
} // @autoreleasepool
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - ImageIO_PNG_DATA 在应用程序从后台移动到前台后继续增长,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23868754/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23868754/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - ImageIO_PNG_DATA 在应用程序从后台移动到前台后继续增长