当仪器中的内存使用率较低时,OS 3.2会抛弃应用程序

时间:2010-09-22 12:16:18

标签: iphone memory-leaks instruments

这是问题所在。我有一个基本上是图片库的应用程序,它从xml提要中提取图像,并在本地存档,然后逐步将5个图像一次加载到滚动视图中进行显示。

使用[UIImage imageNamed:...]和NSURLRequest / NSData时,我遇到了数千个问题,导致应用程序缓存了过多的数据。无论如何,我现在让应用程序以几乎恒定的25-30MB运行,没有突然的峰值,并且只有几KB的数据从内存中泄漏(由于NSKeyedArchiver和我保留了一些值)。然而,应用程序总是被操作系统终止(似乎没有明显的原因)。

很抱歉,如果我有点愚蠢并且没有发现某些东西,崩溃报告似乎确实告诉我应用程序已经分配了大量的内存,但是分配和泄漏工具正在讲述一个不同的故事。我真的认为我的问题更像是“为什么仪器对我说谎?”

Incident Identifier: D258E503-D024-4265-B079-E6C47DE5DA29
CrashReporter Key:   c3904eb2c9cf4bf4f89f53fb9c836ad44586684f
OS Version:          iPhone OS 3.2.1 (7B405)
Date:                2010-09-21 13:27:50 +0100

Free pages:        464
Wired pages:       12587
Purgeable pages:   0
Largest process:   MediaLib

Processes
         Name                 UUID                    Count resident pages
        MediaLib <6db92ce87a5d7e287702f2cb87ba8c53>   30579 (jettisoned) (active)
     debugserver <f885fe2348e72988381a73137cc90c7b>     127
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      64
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      64
            afcd <ddda2413b8953e5c56721dfe05a82d78>      68
    syslog_relay <1c73f841b191556b6911bc6b4736b50f>      63
      DTMobileIS <b34df288cd9a07a995933bbd6b66717a>    1169
notification_pro <4c9a7ee0a5bbe160465991228f2d2f2e>      64
            ptpd <e3f855cfd629600a4812e7e90c77667e>     191
         syslogd <6990426209e51a8ee13c91cd1a050a2e>      78
    mediaserverd <2eda3ce5e1c8a1a4d7b8271cef1f2d12>     314
     debugserver <f885fe2348e72988381a73137cc90c7b>      74
     debugserver <f885fe2348e72988381a73137cc90c7b>      74
     debugserver <f885fe2348e72988381a73137cc90c7b>      74
             lsd <eb108595d2a932a8d244d1ab7386cd0f>     121
            apsd <0775f0d80d1cd1fb4b562d2f94caf051>     172
         notifyd <74e4a487a89c31f68917b22605baf6c6>      68
        BTServer <21dd98c0ab29b910cd51cb703a9cb9b9>     107
      CommCenter <e4b9cc04f083f22232c92ee1363fe669>     170
     SpringBoard <745085d9a24a8529f0ceb6c33d766873>    4821 (active)
      accessoryd <59ca0ba146c28bf5c8ab6e3d2e81bbad>      97
         configd <36001fe17103f8af6d3b525cb23ac8a0>     305
   fairplayd.K48 <2d997ffca1a568f9c5400ac32d8f0782>      85
       locationd <60fd4d90fec18a76ffc0b8a45351fe54>     600
   mDNSResponder <a6f01dd493e3d2bfe318f5d44f8508e2>     107
       lockdownd <378f09833cdc57b1b60e42d79c355938>     273
MobileStorageMou <7f2cd9f90fab302a42a63460b1c4d775>      67
         launchd <880e75c2db9c0f670516c58935e89b58>      80

**End**

非常感谢能够给我一记耳光并指出我正确方向的人;)

编辑:

我刚刚通过活动监视器仪器运行应用程序,这给了我一个65-80MB的“真实内存”读数,这可能是由于在另一个线程上分配了内存,而不是由分配工具?

1 个答案:

答案 0 :(得分:2)

您应该知道NSImage#imageNamed:缓存图像。换句话说,你会失去对这些图像生命周期的精细控制。请改用NSImage#initWith...,不使用缓存。

同样知道,加载到.png时,2KB下载的UIImage图像很容易成为6MB图像。加载到UIImage时,图像数据会被解压缩,因此不要过多地看原始大小。看一下位图的大小。通常只是width * height * 4

您提到NSURLConnectionNSData导致内存问题。这可能是因为使用不当。就像没有做适当的内存管理一样。

如果您想要更好的资源管理提示,请发布代码或更多详细信息。