Приложение выброшено ОС 3.2, когда использование памяти в инструментах мало - PullRequest
1 голос
/ 22 сентября 2010

Вот проблема. У меня есть приложение, которое по сути является галереей изображений, оно извлекает изображения из ленты XML и архивирует их локально, а затем постепенно загружает 5 изображений за раз в представление прокрутки для отображения.

У меня были тысячи проблем с использованием [UIImage imageNamed: ...] и NSURLRequest / NSData, так как оба приложения приводят к кешированию избыточных объемов данных. В любом случае, теперь у меня приложение работает с почти постоянными 25-30 МБ, без резких скачков и с утечкой данных из памяти всего лишь несколько КБ (из-за того, что 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**

Большое спасибо заранее за того, кто может дать мне пощечину и указать мне в правильном направлении;)

EDIT:

Я только что запустил приложение через инструмент мониторинга активности, и это дает мне «Real Memory» показания 65-80 МБ, это может быть связано с распределением памяти в другом потоке, который не захватывается инструмент распределения?

1 Ответ

2 голосов
/ 22 сентября 2010

Вы должны знать, что NSImage#imageNamed: кэширует изображение. Другими словами, вы теряете прекрасный контроль над жизненным циклом этих изображений. Вместо этого используйте NSImage#initWith..., и кеш не будет использоваться.

Также известно, что изображение .png, которое загружается 2 КБ, может легко быть изображением 6 МБ при загрузке в UIImage. Данные изображения распаковываются при загрузке в UIImage, поэтому не смотрите слишком сильно на исходный размер. Посмотрите на размер растрового изображения. Обычно просто width * height * 4.

Вы упоминаете, что NSURLConnection и NSData вызывают проблемы с памятью. Это, вероятно, из-за неправильного использования. Как неспособность сделать правильное управление памятью.

Почтовый индекс или более подробную информацию, если вы хотите лучше советы по управлению ресурсами.

...