这是问题所在。我有一个基本上是图片库的应用程序,它从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的“真实内存”读数,这可能是由于在另一个线程上分配了内存,而不是由分配工具?
答案 0 :(得分:2)
您应该知道NSImage#imageNamed:
缓存图像。换句话说,你会失去对这些图像生命周期的精细控制。请改用NSImage#initWith...
,不使用缓存。
同样知道,加载到.png
时,2KB下载的UIImage
图像很容易成为6MB图像。加载到UIImage
时,图像数据会被解压缩,因此不要过多地看原始大小。看一下位图的大小。通常只是width * height * 4
。
您提到NSURLConnection
和NSData
导致内存问题。这可能是因为使用不当。就像没有做适当的内存管理一样。
如果您想要更好的资源管理提示,请发布代码或更多详细信息。