如何解决一个较早启动但现在“因内存压力而终止”的应用程序?

Posted

技术标签:

【中文标题】如何解决一个较早启动但现在“因内存压力而终止”的应用程序?【英文标题】:How can I address an app that started earlier, but is "Terminated due to Memory Pressure" now? 【发布时间】:2013-09-27 22:45:10 【问题描述】:

我正在 Xcode 中开发一个 ios 应用程序。早些时候,我让它启动并运行,达到了有限的功能水平。然后有编译失败,声称未修改的样板生成的代码有语法错误。将源代码复制到新项目中会遇到不同的问题。

现在,我可以编译并开始运行,但它甚至在启动图像显示之前就表明应用程序由于内存压力而关闭。总视觉资产约为 272M,可以在不损害图形丰富性的情况下进行一些优化,并且是迄今为止该程序唯一预计较大的区域。 (资产可能保存在内存中,也可能不保存;例如,每个当前加载图像都被填充,我的代码从不以编程方式访问任何加载图像。)它在加载图像本身加载之前崩溃。

如何解决这个内存问题?我也许可以精简图像处理方式,但我怀疑还有另一个根本原因。或者这是过多的内存消耗?

谢谢,

【问题讨论】:

您使用的是 272 MB?这将在 iPhone 4S 或更旧的设备上立即被终止。iPhone 5 会处理它,但这是在启动时消耗的大量内存。 所以您在应用启动期间尝试加载近 300MB 的图像? 同意,我建议使用延迟加载 - 仅在应该显示时才加载资源。 在崩溃之前我没有以编程方式加载任何图像;它在显示启动图像之前崩溃。在那之后(它正在工作),我尝试以编程方式加载图像,但我们还没有。崩溃发生在任何程序加载之前,甚至在启动图像显示之前。 并且要明确一点:早些时候,当它工作时,它已经加载了我试图加载的所有图像,并且零崩溃。我可能需要进行优化,但在这种情况下,我认为除了厨房水槽之外的所有内容都包含图形,因此无法加载。确实如此,并且图像权重明显大于当前行为。所以我需要优化,但除了在启动期间加载 300M 的图像之外,还有其他事情发生(我没有对此感到内疚;300M 是所有可用图像的总数),而且它很有可能会导致旧手机崩溃没有改变:它起作用了。 【参考方案1】:

查看 Apple 的 iOS 编程文档的 Performance Tuning 部分。使用 Apple 的 Instruments 应用程序来确定您的应用程序使用内存的方式、时间和大小。

您应该考虑的一种方法是断开图形资源与应用程序的连接,并在您认为它们满足 iOS 的要求和限制时将它们一一添加。

现在,我的这部分答案是意见:听起来你的应用很有可能被 App Store 拒绝,以防你打算使用此应用。

【讨论】:

+1:我同意,如果您在首次启动时使用了这么多内存,这可能会难以通过应用商店审核...您必须优化它。 谢谢。我知道至少有一项优化应该会显着减少总启动图像......但很大一部分大小是启动图像。 关于图像的快速提示是:调整图像大小,使其达到 iOS 将使用的最大尺寸(例如,如果您在磁盘上有一个 600x600 的图像,但在视网膜显示器上只显示为 300x300 , 将源图像的大小调整为 300x300)。 我一直在创建最大尺寸的图像,可以使用。对于使用 Retina 的 iPad 上的纵向和横向加载和背景图像,这仍然是一个很大的重量。还是仅根据需要或代码要求加载加载和背景图像? 这取决于您的代码。您需要避免缓存 UIImage 对象,因为它们会消耗大量内存。确保仅在需要时才从文件系统加载图像。

以上是关于如何解决一个较早启动但现在“因内存压力而终止”的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AssetsLibrary.framework 因内存压力而终止

当我使用 Photos.app 时,我的 iOS 应用程序因内存压力而终止

应用程序突然从“您非法改变 NSFetchedResultsController 的获取请求”的每次启动时崩溃,但解决方案令人不安

AngularJS:如何在页面完全加载之前显示预加载或加载?

使用自定义 Google Now 命令启动 Android 应用

如何调试 Angular 通用?