我该如何解决一个之前已启动但现在因“内存压力终止”的应用程序?

8

我正在使用Xcode开发iOS应用程序。之前,我让它启动并运行了一段时间,但只实现了有限的功能。然后编译失败,声称未经修改的样板生成代码存在语法错误。将源代码复制到新项目中会出现不同的问题。

现在,我可以编译和启动运行,但是在启动图像显示之前,它就声明由于内存压力而关闭了应用程序。总视觉资产约为272M,这可能会在不影响图形丰富度的情况下进行优化,迄今为止是预计程序唯一需要大量内存的领域(该资产可能保存或不保存在内存中;例如,每个当前的加载图像都已填充,我的代码从未通过编程方式访问任何加载图像)。它在加载图像本身加载之前就崩溃了。

我该如何解决这个内存问题?我可能能够简化图像处理方式,但我怀疑还有另一个根本原因。或者这是过度的内存消耗吗?

谢谢!


1
你正在使用272 MB的内存?这将立即在iPhone 4S或更早的设备上被杀掉。iPhone 5可以处理它,但这是在启动时消耗的巨大内存量。 - JRG-Developer
1
所以你试图在应用程序启动期间加载近300MB的图像? - Wain
同意,我建议使用懒加载 - 只有在需要显示时才加载资源。 - Petro Korienev
在它崩溃之前,我没有通过编程加载任何图像;它在显示启动图像之前就已经崩溃了。在那之后(并且当时它是工作的),我尝试通过编程加载图像,但我们还没有达到那个阶段。这个崩溃发生在任何程序加载甚至显示启动图像之前。 - Christos Hayward
为了明确:早些时候,当它工作时,它已经加载了我尝试加载的所有图像,并且没有崩溃。我可能需要进行优化,但在这种情况下,我认为我没有包含所有图形,因此它无法加载。它确实可以,并且比现在的行为具有更大的图像权重。因此,我需要进行优化,但是除了在启动期间加载300M的图像(我不会做那样的事;300M是所有可用图像的总和)之外,还发生了其他事情,而且它很可能会使旧手机崩溃,但这并不影响:它曾经工作过。 - Christos Hayward
1个回答

4
请查看苹果的iOS编程文档中Performance Tuning部分。使用苹果的Instruments应用程序确定您的应用程序何时以及使用了多少内存。
您应该考虑的一种方法是从应用程序中断开图形资源,然后逐个添加它们,直到满足iOS的要求和限制为止。
现在,这部分回答是我的观点:如果您打算将此应用程序提交App Store,则听起来您的应用程序很可能会被拒绝。

1
+1:我同意,如果你在初始启动时使用了太多的内存,这很可能会在应用商店审核中遇到麻烦...你必须对此进行优化。 - JRG-Developer
谢谢。我知道至少一种优化方法,可以显著减少总的启动图像...但是大部分大小都是启动图像。 - Christos Hayward
关于图片的一个小技巧是:将图片调整大小,使其达到 iOS 可以使用的最大尺寸(例如,如果您在磁盘上有一张 600x600 的图片,但只在视网膜显示器上将其显示为 300x300,则将源图像调整为 300x300)。 - bneely
我一直在创建尺寸为最大可能使用的图像,无论是在iPad上加载肖像或横向加载和背景图像,在Retina显示屏下都会有很大的负担。或者说,加载和背景图像只在需要时或由代码调用时才被加载? - Christos Hayward
这取决于你的代码。你需要避免缓存UIImage对象,因为它们会消耗大量内存。确保只在需要时从文件系统加载图像。 - bneely
注意:当它在运行时,内存使用量约为4M。272M是捆绑包中资产的总大小,包括启动图像和背景,而不是我懒惰加载的内容。 - Christos Hayward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接