iPhone 应用程序运行了数百次,然后在启动时因内存错误而崩溃,然后直到重新启动才运行 - 为什么?

标签 iphone memory crash cocos2d-iphone textures

我有一个 Cocos2d/openGL iPhone 游戏。这是一款通用应用程序,我在 iPad 上遇到了一个偶尔但令人讨厌的错误。

我们预先加载了大量纹理(3 个 2048x2048 纹理)。我正在努力减少这种前期负载,但令我担心的是我真的不明白这次崩溃导致应用程序永久崩溃的根本原因。

这是交易: 1. 应用程序在 iPad 上运行数百次即可正常运行 2.最终(我猜测是由于其他程序占用了一些内存并且没有释放或其他原因)应用程序在启动时开始崩溃。它只是在加载过程中再次关闭。 3. 该应用程序现在将不再在该 iPad 上运行,每次都会立即关闭,直到 iPad 重新启动。

显然,我的应用程序每次都需要太多内存才能可靠地工作,我明白了。我不明白的是为什么当它失败一次时,它就会永远失败,直到iPad重新启动。谁能解释一下这是怎么回事?

编辑:忘记添加

组织者崩溃滞后只是说内存不足,每次都是这样(我将我的应用程序名称更改为下面的 MyAppName)。再说一次,我知道它的内存不足,但为什么它在重新启动之前一直保持低内存状态?:

Incident Identifier: E7A2507C-3FB1-4E3B-B315-09F094236541
CrashReporter Key:   0fda9d667f2c6073f20a76809aa25438b6854d15
OS Version:          iPhone OS 3.2 (7B367)
Date:                2010-04-30 16:59:44 -0400

Free pages:        437
Wired pages:       17228
Purgeable pages:   0
Largest process:   MyAppName

Processes
         Name                 UUID                    Count resident pages
       MyAppName <6307ce41802850944baa78d29224fa7f>   22385 (jettisoned) (active)
    mediaserverd <ea8bac28b06fe3980fdd44b5caceb563>     242
      DTMobileIS <a0f651e43881e66f50f8a95abea72921>    5826
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      67
    syslog_relay <4ceaed776d2df957fa130712f4ef21d0>      66
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      67
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      67
            afcd <4f3c9566e33b4463f05603d990584e5d>      72
            ptpd <83de0f774bd6553d513ae9e19b0f9b56>     181
         syslogd <66247e305d5c0bf6f1ce1cc950653263>      81
             lsd <a4d852c1c8da2b3d231bdc90887b52ba>     130
            iapd <a8534cbde4b90ad5915dd26ab03ff3e3>     204
         notifyd <5e9d5bee7c3eae1c8b494c79eb11406e>      71
        BTServer <64e4a6ea6b1240db2331e05a29caa862>     108
      CommCenter <97bf297944ac4bde19bcee96dd23bd5f>     181
     SpringBoard <c7a5904c12db7b14334a4edaa4cabaa9>    5339 (active)
         configd <aca9fa3380322669164fd6b1a3864300>     373
   fairplayd.K48 <2d997ffca1a568f9c5400ac32d8f0782>      84
       locationd <dd1ea88105c62173908ce767db5c4d37>     599
   mDNSResponder <820560222d47a1f2a0dce98a7f8a9721>     108
       lockdownd <497fd54c79a680bf29f5d9320f514613>     303
MobileStorageMou <c277b79c2157c4dc5cfc5c3ca35bd5f2>      69
         launchd <66972eee4d865c4383b33d985d22994b>      98

**End**
<小时/>

最佳答案

我的猜测是,在刚启动的 iPad 上,您恰好有足够的可用 RAM 来加载所有纹理。然后,在某个时间点,iPad 上的其他进程(例如邮件)开始消耗更多内存,因此没有为您的应用程序留下足够的内存。

您的崩溃日志显示您的应用使用了 22385 页内存,约为 87 兆(假设 iPad 和 iPhone 上的页面大小相同,iPhone 上为 4k)。

此外,它还显示 SpringBoard 正在使用 5339 页内存,大约为 20 兆。我不了解 OpenGL,但我听说使用 Core Animation,每当将图像设置为 CALayer 的内容时,未压缩的图像数据就会分配在 SpringBoard 管理的共享内存中。

总而言之,对于具有 256 兆 RAM 且没有交换文件的设备来说,87 + 20 兆内存是很大的内存...

关于iPhone 应用程序运行了数百次,然后在启动时因内存错误而崩溃,然后直到重新启动才运行 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2750949/

相关文章:

iphone - 从 NIB 实例化时会调用 UIView 的什么方法?

iphone - 在 iOS 中本地创建条形码

c# - 什么数据结构最好存储数百万数据但占用内存最少

ios - PromiseKit AnyPromise 然后崩溃 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000010

ios - 如何将 UIDatepicker 组件从日/月/年更改为年/月/日

iphone - 开发成本

javascript - 预览内存中的内容 (javascript)

memory - 低级编程: How to find data in a memory of another running process?

c# - 如果计算机在保留内存映射文件时挂起,会发生什么情况?

java - Android 应用程序在解析一个特定网站时崩溃